$() はサブシェルですか?

$() はサブシェルですか?

サブシェル構文は、変数の値を取得できるサブシェルだけであることを(<commands...>)理解しています。$()

注:これは文書の異なる表現に従ってbash 4.4に適用されます。

答え1

$(…)定義によると、これはサブシェルです。これはシェルランタイム状態のコピーであり、サブシェルの状態変更は親シェルには影響しません。サブシェルは通常、次の方法で実装されます。分岐新しいプロセス(ただし、一部のシェルは特定の状況でこれを最適化できます)

変数値を取得できるサブシェルではありません。変数の変更が親に影響を与える場合、子シェルではありません。これはサブシェルです。出力両親が検索できます。生成されたサブシェルには、親シェルが出力を$(…)読み取って収集するパイプに設定された標準出力があります。

サブシェルを作成するためのいくつかの異なる構成があります。私はこれがbashの完全なリストだと思います。

  • サブシェルはグループ( … )サブシェルを作成して終了するのを待つ以外は何もしません。これは{ … }、グループコマンドが構文目的でのみ使用され、サブシェルを生成しないこととは対照的です。
  • 背景… &サブシェルを作成して終了するのを待ちません。
  • 管路… | …左右に1つずつ2つのサブシェルを作成し、両方のサブシェルが終了するのを待ちます。シェルはパイプを生成し、左側の標準出力をパイプの書き込み端に、右側の標準入力を読み取り端に接続します。一部のシェル(ksh88、ksh93、zsh、bash、およびlastpipeオプション設定され有効)右側は元のシェルで実行されるため、パイプライン構成はサブシェルのみを生成します。
  • コマンドの置き換え:($(…)スペルとも呼ばれる`…`)は、標準出力がパイプに設定されたサブシェルを生成して親出力を収集し、末尾の改行文字を除く対応する出力に拡張します。 (分割とワイルドカードによって出力がさらに影響を受ける可能性がありますが、これは別の話です。)
  • プロセスの置き換え<(…)標準出力がパイプに設定され、パイプ名に拡張されたサブシェルを作成します。親プロセス(または他のプロセス)はパイプを開いてサブシェルと通信できます。>(…)同じことを行いますが、標準入力でパイプを使用します。
  • コラボレーション処理coproc …サブシェルを作成して終了するのを待ちません。サブシェルの標準入力と出力はそれぞれパイプに設定され、親シェルは各パイプのもう一方の端に接続されます。

^ 別のシェルを実行するのとは異なり

答え2

bash バージョン 4.4 の bash(1) のマニュアルページ、「拡張」セクション、「コマンドの置換」サブセクションで:

commandBashはサブシェル環境で実行して拡張を実行します。 [...]

答え3

はい、別のプロセスで実行される( commands... )サブシェルです。bashcommands...

唯一の違い$( commands... )は、コードのこの部分が実行後に作成されることですcommands...commands...stdout

関連情報