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.
Я просто по-другому подивився на це і вирішив, що можу зробити кращу роботу з поводженням з помилками. Він пропустить dir, в який він не зможе cd- і cdнадрукує повідомлення про те, чому робити stderr, - і він буде breakбез ненульового коду виходу, якщо ваш файл commandне виконується успішно або якщо запуск commandякимось чином впливає на його здатність повернутися до початкового каталогу - $OLDPWD. У цьому випадку він також виконує cd -останнє - і записує отримане поточне ім'я робочого каталогу в stderr.
youtube-dl.