Почему оболочка выполняет расширение пути для утилит?

Этот вопрос является продолжением https://stackoverflow.com/questions/7136899/how-does-grep-work

Кажется, что shell делает расширение *.* ко всем применимым / доступным файлам и предоставьте это таким утилитам, как grep,

Почему shell нужно сделать это? Почему бы не оставить расширение пути к самой утилите?

5 ответов

Решение

Ну, одна из причин в том, что каждая утилита должна была бы реализовать эту функциональность. Если оболочка делает это, она реализуется только один раз.

Потому что если бы оболочка не предоставляла эту функцию, каждая маленькая утилита должна была бы реализовать ее.

Это также гарантирует, что расширение работает одинаково для каждой команды.

Кстати, расширение происходит не только в аргументах команды, оно может происходить где угодно в сценарии оболочки; например:

for file in *.c; do something; done

Если бы оболочка не обеспечивала эту функциональность, то каждая утилита должна была бы реализовать свою собственную функцию подстановочных знаков (и, вероятно, большинство не будет беспокоиться об этом). Как таковая, каждая утилита должна обрабатывать только отдельные имена файлов, что намного проще.

Потому что жизнь была бы ужасно ужасна, если бы этого не произошло.

Это философия Unix: "У одного инструмента хорошо получается одно". Зачем кому-то нужен такой повтор кода в каждой утилите? Какой смысл в том, чтобы каждая утилита после main() вызывала expand_pathnames()? Какой смысл возлагать это бремя не только на программы на C, но и на все скомпилированные языки и языки сценариев? Во всем этом нет никакого смысла. Вот почему Microsoft и мерзость cmd.exe ошиблись с самого первого дня:-)

Кстати, если вы хотите отключить глобализацию имени файла, вы можете сделать это с

$ set -f
$ echo *
*
$ set +f
$ echo *
readme foo.o bar.txt
Другие вопросы по тегам