Bashの機能は子プロセスとして実行されますか?

Bashの機能は子プロセスとして実行されますか?

存在する高度なバッシュスクリプトガイド、存在する例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]# 

関連情報