这个问题是https://stackoverflow.com/questions/7136899/how-does-grep-work
似乎确实shell
将 扩展*.*
到所有适用/可用文件并将其提供给诸如 之类的实用程序grep
。
为什么需shell
要这样做?为什么不把路径名扩展留给实用程序本身呢?
答案1
原因之一是每个实用程序都必须实现该功能。如果 shell 执行该操作,则只需实现一次。
答案2
因为如果 shell 没有提供这个功能,那么每个小实用程序都必须实现它。
这还确保扩展对于每个命令都以完全相同的方式工作。
顺便说一下,扩展不仅发生在命令参数中,它可以出现在 shell 脚本中的任何位置;例如:
for file in *.c; do something; done
答案3
如果 shell 不提供该功能,那么每个实用程序都需要实现自己的通配符功能(而且可能大多数实用程序都懒得这么做)。实际上,每个实用程序只需处理单个文件名,这要简单得多。
答案4
这是 Unix 的哲学,“用一个工具做好一件事”。为什么有人希望在每个实用程序中重复该代码?让每个实用程序在 main() 之后调用 expand_pathnames() 有什么意义?不仅将这个负担放在 C 程序上,而且放在所有编译语言和脚本语言上有什么意义?所有这些都毫无意义。这就是为什么微软和 cmd.exe 从一开始就犯了错误 :-)
顺便说一句,如果你想关闭文件名通配符,你可以这样做
$ set -f
$ echo *
*
$ set +f
$ echo *
readme foo.o bar.txt