Как известно, язык shell (впрочем, как многие другие языки, скажем, тот же C) достаточно своенравен и требует от программиста понимания его "духа". Несколько лет назад автору довелось провести занятие по программированию на shell. Слушатели были настроены крайне самоуверенно и категорически отказывались выполнять упражнения, утверждая, что упражнения эти абсолютно банальны. Однако после того, им было предложено описать результат выполнения следующих примеров:
if 0 then echo aaaa fi if 1 then echo bbbb fi if [0] then echo cccc fi if [1] then echo dddd fi
выяснилось, что даже на таком простом уровне shell владели совсем немногие (а можете ли описать результат вы?).
К сожалению, вынужден констатировать, что лишние знания мешают писать правильные программы. Можете проверить это на себе. Попробуйте правильно (то есть для всех без исключения ситуаций) решить казалось бы тривиальную задачу:
Как удалить все файлы в текущем каталоге?
Учли ли вы, что в этом каталоге могут быть "чужие"... файлы?
Да, да, я догадываюсь, что у вас есть права суперпользователя. Вам их достаточно?
Вы написали "rm *"? Вспомните, что в каталоге могут содержаться подкаталоги.
Вы исправили команду на "rm -r *"? Но в каталоге могут быть файлы, имя которых начинается с точки.
Вы остановились на "rm -r *.*"? Думаю, вас в полной мере позабавила диагностика о попытке удалить вышележащий каталог. Не был ли это корневой каталог? Сердце екнуло? Да целы ваши данные ... скорее всего.
Вы уже вспомнили о том, что в каталоге могут быть файлы с именем "-r" или "-f"?
Допускаете ли вы, что в текущем каталоге может быть несколько тысяч файлов?
Вы уже учли, что имя файла может содержать самые разнообразные символы, в частности, переход на следующую строку?
Сколько уровней вложенности каталогов "по зубам" вашему решению – 400-500 каталогов не слабо?
Подумайте и скажите, какую еще свинью (список выше не полон) может подложить вам автор?
Согласны ли вы, что правильной программы не существует?
С удовольствием познакомлюсь со всевозможными решениями данной задачи.