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.