Shell-Script

為什麼 POSIX 強制實用程序沒有內置到 shell 中?

  • March 22, 2017

這個問題的目的是回答好奇心,而不是解決特定的計算問題。問題是:為什麼 POSIX 強制實用程序通常不內置到 shell 實現中?

例如,我有一個腳本,它基本上讀取一些小文本文件並檢查它們的格式是否正確,但由於大量的字元串操作,在我的機器上執行需要 27 秒。這種字元串操作通過呼叫各種實用程序創建了數千個新程序,因此速度很慢。我非常有信心,如果內置了一些實用程序,即grepsedcuttrexpr,那麼腳本將在一秒鐘或更短的時間內執行(基於我在 C 方面的經驗)。

似乎在很多情況下,建構這些實用程序會影響 shell 腳本中的解決方案是否具有可接受的性能。

顯然,選擇不內置這些實用程序是有原因的。也許在系統級別擁有一個實用程序版本可以避免該實用程序的多個不同版本被各種 shell 使用。我真的想不出很多其他原因來保持創建這麼多新程序的成本,而且 POSIX 對實用程序的定義足夠多,因此擁有不同的實現似乎不是什麼大問題,只要它們都是 POSIX合規。至少沒有這麼多流程效率低下那麼大的問題。

預計 Shell 腳本不會以這種速度執行。如果您想提高腳本的速度,請在 perl 中嘗試。如果這仍然太慢,那麼您將不得不轉向靜態類型語言,例如 java 或 c,或者為 perl 編寫一個 C 模組來執行太慢的部分。

Shell 是原型設計的第一級,如果你可以用 shell 證明這個概念,然後轉向更好的腳本語言,它可以做更多的邊界檢查,這需要幾英畝的 shell。

一個 Unix OS 應該包含許多小程序,這些小程序可以完成定義明確的任務,從而構成更大的圖景。這是一件好事,因為它劃分了更大的程序。以 qmail 為例,並將其與 sendmail 進行比較。qmail 由許多程序組成:

http://www.nrg4u.com/qmail/the-big-qmail-picture-103-p1.gif

利用網路守護程序不會幫助您利用隊列管理器。

為什麼 POSIX 強制實用程序沒有內置到 shell 中?

因為要符合 POSIX,系統需要1將大多數實用程序作為獨立命令提供。

將它們內置意味著它們必須存在於外殼內部和外殼外部的兩個不同位置。當然,可以通過對內置程序使用 shell 腳本包裝器來實現外部版本,但這會對呼叫實用程序的非 shell 應用程序不利。

請注意,BusyBox採用了您建議的路徑,方法是在內部實現許多命令,並使用指向自身的連結提供獨立變體。一個問題是,雖然命令集可能非常大,但實現通常是標準的子集,因此不兼容。

另請注意,至少ksh93,bashzsh通過為正在執行的 shell 提供自定義方法來從共享庫動態載入內置函式。從技術上講,沒有什麼可以阻止所有 POSIX 實用程序作為內置程序實現和提供。

最後,生成新程序已成為現代作業系統的一項快速操作。如果您真的遇到性能問題,可能會有一些改進以使您的腳本執行得更快。

1 POSIX.1-2008

但是,所有標準實用程序,包括表中的正常內置程序,但不包括特殊內置實用程序中描述的特殊內置程序,都應以可以通過 exec 系列訪問的方式實現POSIX.1-2008 的系統介面卷中定義的函式,並且可以由那些需要它的標準實用程序(env、find、nice、nohup、time、xargs)直接呼叫。

引用自:https://unix.stackexchange.com/questions/347188