Bash
函式在 Bash 中作為子程序執行嗎?
在Advanced Bash-Scripting Guide中,在範例 27-4中,從底部開始的第 7 行,我讀過這個:
函式作為子程序執行。
我在Bash中做了一個測試,看來上面的說法是錯誤的。
在這個網站上的搜尋、Bash Man 和我的搜尋引擎沒有帶來任何亮點。
你有答案並想解釋一下嗎?
高級 Bash 腳本指南並不總是可靠的,它的範例腳本包含過時的做法,例如使用有效棄用的反引號進行命令替換,即,
command
而不是$(command)
.在這種特殊情況下,這是明顯不正確的。
(canonical) Bash 手冊中關於Shell Functions的部分明確指出
Shell 函式在目前 shell 上下文中執行;沒有創建新的過程來解釋它們。
花括號函式將在呼叫 shell 程序中執行,除非它們需要自己的子 shell,即:
- 當你在後台執行它們時
&
- 當您將它們作為管道中的連結執行時
重定向或額外的環境。變數不會強制使用新的子shell:
hw(){ echo hello world from $BASHPID echo var=$var } var=42 hw >&2 echo $BASHPID #unexports var=42 and restores stdout here
如果您使用括號而不是花括號定義函式:
hw()( echo hello world from $BASHPID ) hw echo $BASHPID
它將始終在新程序中執行。
命令替換
$()
也總是在 bash 中創建程序(但不是在 ksh 中,如果你在其中執行內置函式)。