存在する高度なバッシュスクリプトガイド、存在する例27-4、一番下から7行目を読みました。
関数は子プロセスとして実行されます。
Bashでテストしましたが、上記の説明が間違っているようです。
このサイトでBash Manと私の検索エンジンを検索しても手がかりはありませんでした。
答えがあり、説明する意向がありますか?
答え1
高度なBashスクリプトガイドは常に信頼できるわけではなく、サンプルスクリプトには次のような古い慣行が含まれています。効果的に使用されないコマンド置換のためのバックティック(例えば`command`
。$(command)
この特別なケースでは、これは明らかに間違っています。
このセクションは次のとおりです。シェル機能(正規) Bash マニュアルに明確に記載されています。
シェル機能は現在シェルのコンテキストで実行され、それを解釈するための新しいプロセスは作成されません。
答え2
中括弧関数は、独自のサブシェルが必要ない限り、呼び出しシェルプロセスで実行されます。つまり、
- バックグラウンドで実行するとき
&
- パイプラインのリンクとして実行する場合
リダイレクトまたは追加の環境。変数は新しいサブシェルを強制しません。
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では生成されません)。
答え3
この例の関連コマンドは次のとおりです。
echo ${arrayZ[@]/%e/$(replacement)}
後者の例は以下を指摘しています。
# $( ... ) is command substitution.
# A function runs as a sub-process.
ABSガイドへの配慮として、彼らは明らかにこの関数を次の形式で書いたかったのです。コマンドの置き換えそして、コマンドの代替コマンドは次のとおりです。サブシェル。
答え4
私が注目したいのは背景、bash関数はサブシェルで実行されます。この事実を確認している間、偶然にこのような質問を発見したので、この事実を知ることになりました。
[192.168.28.1 (1ae7468c) ~ 19:17:50]# function foo () { echo $BASHPID; }
[192.168.28.1 (1ae7468c) ~ 19:17:59]# foo
807477
[192.168.28.1 (1ae7468c) ~ 19:18:02]# foo
807477
[192.168.28.1 (1ae7468c) ~ 19:18:03]# foo &
[1] 1996783
1996783
[1]+ Done foo
[192.168.28.1 (1ae7468c) ~ 19:18:06]#