是否允許 shell 優化無用的終止命令?
如果要求 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 編譯器對它動態連結到的函式呼叫中的程式碼知之甚少,無法進行呼叫。