Bash

函式在 Bash 中作為子程序執行嗎?

  • August 3, 2021

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 中,如果你在其中執行內置函式)。

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