為什麼 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

相關內容