为什么 shell 要对实用程序执行路径名扩展?

为什么 shell 要对实用程序执行路径名扩展?

这个问题是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

相关内容