Если цель состоит в том, чтобы выполнить работу, то используйте готовые инструменты, такие как 'find
' или 'ls -R
', чтобы выполнить работу надежно.
Если предположить, что целью является изучение рекурсии и сценариев оболочки, а не выполнение работы, то это не работает нормально по ряду причин:
- Он не будет обрабатывать имена с пробелами в них.
- Если что-то не является каталогом,
cd
в лучшем случае выдаст сообщение об ошибке.
- В худшем случае, если CDPATH установлен, а имя можно найти в CDPATH, тогда сценарий станет бесполезным.
- Поскольку вы не проверяете, работает ли
cd
, вы склонны видеть одни и те же файлы, перечисленные снова и снова, и снова и снова (один раз для каждого файла в данном каталоге).
Кроме того, две точки с запятой являются лишними.
Если вам нужно использовать cd
в скрипте, обычно лучше сделать это в под-оболочке:
if [ -d $i ]
then ( cd $; pwd; recur_fun )
fi
Когда суб-оболочка завершает работу, вы знаете, что родитель все еще находится в том же месте, где он был раньше - это не зависит от капризов того, что команда cd
делает с символьными ссылками. Современные оболочки (что означает bash
), кажется, думают, что вы обычно должны хотеть 'логическую cd
' операцию, которая чертовски раздражает меня, потому что я почти никогда не хочу такого поведения.