cd -P .
for dir in ./*/
do cd -P "$dir" ||continue
printf %s\\n "$PWD" >&2
command && cd "$OLDPWD" ||
! break; done || ! cd - >&2
Приведенная выше команда не нуждается в каких-либо подоболочках - она просто отслеживает свой прогресс в текущей оболочке, чередуя $OLDPWD
и $PWD
. Когда вы cd -
обмениваетесь значения этих двух переменных, в основном, как он меняет каталоги. Он также печатает имя для каждого каталога, так как он работает там в stderr.
Я только что взглянул на это и решил, что смогу лучше справиться с обработкой ошибок. Он пропустит каталог, в который он не может cd
- и cd
напечатает сообщение о том, почему stderr - и будет break
иметь ненулевой код выхода, если ваш command
не выполняется успешно или если запуск command
каким- либо образом влияет на его способность вернуться в исходный каталог -$OLDPWD
. В этом случае он также делает cd -
последний - и записывает полученное имя текущего рабочего каталога в stderr.
youtube-dl
.