Advanced Bash-Scripting Guide で、 example 27-4 で、下から7行目、これを読みました:
関数はサブプロセスとして実行されます。
私はバッシュでテストを行いましたが、上記の記述は間違っているようです。
このサイト、バッシュマン、および私の検索エンジンでの検索は、何の光ももたらしません。
答えはありますか、説明したいですか?
Advanced Bash-Scripting Guideは常に信頼できるとは限りません。そのサンプルスクリプトには、コマンド置換に 実質的に非推奨 バックティックを使用する、つまり$(command)
ではなく`command`
などの古いプラクティスが含まれています。
この特定のケースでは、それは明らかに不正確です。
(正規の)Bashマニュアルの Shell Functions に関するセクションには、
シェル関数は現在のシェルコンテキストで実行されます。それらを解釈するための新しいプロセスは作成されません。
中括弧関数は、次のような独自のサブシェルが必要でない限り、呼び出し元のシェルプロセス内で実行されます。
&
_を使用してバックグラウンドで実行するとリダイレクトまたは追加の環境。変数は新しいサブシェルを強制しません:
_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では作成されません)。
この例の問題のコマンドは次のようになります。
echo ${arrayZ[@]/%e/$(replacement)}
例は後で述べています:
# $( ... ) is command substitution.
# A function runs as a sub-process.
ABSガイドに慈善的であり、彼らが書こうとしているのは、関数がコマンド置換内で実行され、コマンド置換内のコマンドがサブシェルで実行されることです。