Linux

使用子外殼的成本是多少?

  • October 30, 2018

希望這個問題不是太籠統。我對 shell 腳本非常陌生,我來自電腦體系結構/非腳本程式背景。我注意到我工作中的腳本很少是通過圍繞整個腳本製作子外殼來編寫腳本的。在我正在編寫的腳本中,當我可以用一個子 shell 封裝它時,我會這樣做,因為它可以防止它與其他呼叫我的腳本混淆(以防萬一)。由於與此方法相關的一些成本,這不是一種常見做法嗎?我很難在網上找到這個。

例子:

#!/bin/bash
( #Start of subshell
echo "Some stuff here"
) #End of subshell

子殼確實有成本。

在我的系統上,最小的 fork-exec 成本(當文件不冷時從磁碟執行程序時)大約是2ms,最小的 fork 成本大約是1ms.

使用子shell,您僅在談論分叉成本,因為不需要exec編輯文件。如果子外殼保持合理的低水平,1ms那麼在面向人類的程序中是可以忽略不計的。我相信人類不會注意到任何比它發生得更快的事情50ms(這就是現代腳本語言解釋器甚至需要多長時間才能開始(我python在這裡談論和 ruby rvm​​)以及最新的nodejs佔用100ms)。

但是,它確實添加了循環,然後您可能想要替換例如相當常見的 bactick 或$()模式,您return可以通過將函式列印到標準輸出來替換函式中的某些內容,以便父 shell 使用類似 bashisms 進行擷取printf -v(或使用快速的外部程序來處理整個批次)。

bash-completion包通過使用http://fvue.nl/wiki/Bash:_Passing_variables_by_reference中描述的技術通過傳遞的變數名返回來專門避免這種子shell成本


比較

time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null 

time for((i=0;i<10000;i++)); do echo hello; done >/dev/null 

應該可以很好地估計您的系統fork成本是多少。

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