Shell

是否允許 shell 優化無用的終止命令?

  • July 16, 2020

如果要求 shell 執行一個可能無用(或部分無用)的已知要終止的命令,例如cat hugeregularfile.txt > /dev/null,它是否可以跳過該命令的執行(或執行更便宜的等效命令,例如 touch -a hugeregularfile.txt)?

更一般地說,shell 是否類似於 C 編譯器,因為它可以對原始碼執行任何轉換,只要外部可觀察的行為就像抽像機器評估它一樣?

編輯

Nota Bene:我最初提出的問題的標題是詢問是否允許shell進行這些優化,而不是是否應該甚至是否存在可以進行這些優化的實現。我對理論比對實踐更感興趣,儘管兩者都是受歡迎的。

不,那是個壞主意。

cat hugeregularfile.txt > /dev/null並且touch -a hugeregularfile.txt不一樣。cat將讀取整個文件,即使您將輸出重定向到/dev/null. 閱讀整個文件可能正是您想要的。例如,為了記憶體它,以便以後的讀取會明顯更快。shell無法知道你的意圖。

同樣,C 編譯器永遠不會優化讀取文件,即使您不查看您閱讀的內容。

不,因為/dev/null只是一個名稱,它可以用於任何其他設備或文件,而不是“通常”是數據接收器。

因此,根據名稱,shell(或任何其他程序)不知道它正在寫入的**文件是否正在對數據進行“真實”的操作。**AFAIK也沒有shell程序可以進行的系統呼叫,以確定例如文件描述符實際上沒有做任何事情。

您與優化 C 程序中的程式碼的比較是行不通的,因為 shell 沒有 C 編譯器對一段原始碼的全面概述。shell/dev/null對優化您的範例知之甚少,更像是 C 編譯器對它動態連結到的函式呼叫中的程式碼知之甚少,無法進行呼叫。

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