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

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

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

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

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

решение1

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

решение2

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

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

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

for file in *.c; do something; done

решение3

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

решение4

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

Кстати, если вы хотите отключить подстановку имен файлов, вы можете сделать это с помощью

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

Связанный контент