1

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

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

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

5 ответов5

4

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

2

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

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

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

for file in *.c; do something; done
2

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

1

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

1

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

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

$ set -f
$ echo *
*
$ set +f
$ echo *
readme foo.o bar.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .