在 bash 腳本中創建函式時,似乎人們經常在子 shell 中運行該函式,即
function(){(
)}
代替
function(){
}
{()}使用而不是僅僅{}如果有的話有什么好處/缺點?
uj5u.com熱心網友回復:
括號使函式在子shell 中運行,子shell 是與父shell 隔離的子行程。當您想要在不影響函式外部代碼的行為的情況下進行行程范圍的環境更改時,它們很有用。
示例包括:
更改當前目錄
cd不會影響父 shell 。cd在子shell 中運行是pushd和popd.變數賦值與子shell 隔離。您可以臨時更改全域設定
$PATH,而$IFS無需在前后仔細保存和恢復它們的值。當子shell 退出時,shell選項更改
set或shopt將自動恢復。例如,我通常會寫(set -x; some-commands)臨時啟用命令日志記錄。安裝的信號處理
trap程式僅在子外殼中有效。您可以在函式執行期間安裝自定義INT( Ctrl-C) 處理程式,或EXIT在函式回傳時運行清理代碼的自定義處理程式。func() {( echo 'entering func' >&2 trap 'echo exiting func >&2' EXIT ... )}如果
exit呼叫它不會導致整個腳本退出。exit如果您想從呼叫堆疊中的多個函式呼叫作為一種窮人的“例外”,這很有用。或者,如果您想獲取可能退出的腳本,將其包裝在子 shell 中將防止它殺死您的腳本。
( . ./script-that-might-exit echo "script set \$foo to $foo" echo "script changed dir to $PWD" )
有趣的事實:函式不必用大括號分隔。省略大括號并使用括號作為分隔符是合法的:
func() (
# runs in a subshell
)
uj5u.com熱心網友回復:
如果exit在子shell 中呼叫(..),它只會終止該運算式。此外,代碼可以自由更改變數的值以及全域選項(通過set);這些更改在周圍的代碼中看不到,并且在運算式退出時消失了,這可以簡化對代碼正確性的推理。
當你(...)在函式內部使用時,請注意這個陷阱:函式return內部的命令(...)不會從函式回傳;它只會終止(...),就像exit. 如果您在 之后有命令(...),則它們將執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/484895.html
下一篇:如何在反應功能組件中創建高階功能
