web-dev-qa-db-ja.com

関数はBashのサブプロセスとして実行されますか?

Advanced Bash-Scripting Guide で、 example 27-4 で、下から7行目、これを読みました:

関数はサブプロセスとして実行されます。

私はバッシュでテストを行いましたが、上記の記述は間違っているようです。

このサイト、バッシュマン、および私の検索エンジンでの検索は、何の光ももたらしません。

答えはありますか、説明したいですか?

28
user147505

Advanced Bash-Scripting Guideは常に信頼できるとは限りません。そのサンプルスクリプトには、コマンド置換に 実質的に非推奨 バックティックを使用する、つまり$(command)ではなく`command`などの古いプラクティスが含まれています。

この特定のケースでは、それは明らかに不正確です。

(正規の)Bashマニュアルの Shell Functions に関するセクションには、

シェル関数は現在のシェルコンテキストで実行されます。それらを解釈するための新しいプロセスは作成されません。

36

中括弧関数は、次のような独自のサブシェルが必要でない限り、呼び出し元のシェルプロセス内で実行されます。

  • _&_を使用してバックグラウンドで実行すると
  • それらをパイプラインのリンクとして実行すると

リダイレクトまたは追加の環境。変数は新しいサブシェルを強制しません:

_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では作成されません)。

32
PSkocik

この例の問題のコマンドは次のようになります。

echo ${arrayZ[@]/%e/$(replacement)}

例は後で述べています:

#    $( ... ) is command substitution.
#    A function runs as a sub-process.

ABSガイドに慈善的であり、彼らが書こうとしているのは、関数がコマンド置換内で実行され、コマンド置換内のコマンドがサブシェルで実行されることです。

9
John1024