這個問題是續集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