これまで私の知る方法は主に2つです。
明らかに:コマンドリストを括弧で囲みます。
暗黙的に:パイプラインの各コマンド
Bashでサブシェルを生成するためのより多くの方法(明示的または暗黙的)がありますか?
答え1
からman bash
:
- コマンドが制御演算子によって終了すると、
&
シェルはサブシェルのバックグラウンドでコマンドを実行します。シェルは、コマンドが完了するのを待たずに状態0を返します。 - コプロセスは予約語の前にあるシェルコマンドです
coproc
。
Coprocess は、コマンドと制御演算子を使用してコマンドが終了したかのように、サブシェルで非同期で実行されます。 - シェル組み込み
complete
コマンド:-C command
オプションと一緒に呼び出されると、command
サブシェル環境で実行され、その出力は可能な完成として使用されます。 - コマンド置換、括弧でグループ化されたコマンド、および非同期コマンドは、シェル環境と複製サブシェル環境で呼び出されます。
答え2
「サブシェル」の意味によって異なります。 「パイプラインのすべてのコマンド」の箇条書き項目のポイントを見逃した可能性があります。
走るたびにどの(外部)プログラム(シェルに組み込まれていないスクリプトやバイナリ実行可能ファイルなど)を使用しない限り、サブプロセスで実行されます。シェルはプログラムを分岐して実行します。ジョブ自体と同様に、サブシェルは作成されません。exec program
ls | wc
ls
wc
興味深いことに、それをパイプラインに含めると、次のような結果が発生する可能性があります。内蔵シェルサブシェルで実行。次の例を考えてみましょう。
$vを読む 猫 #ユーザーが入力した内容。 $echo "$v" 猫 $エコクーガーを読む| $echo "$v" 猫
2番目のコマンドはパイプラインの一部であるread v
ため、サブシェルで実行されます。echo cougar | read v
したがって、値がcougar
失われ、$v
元の値を保持します。
同様に、このようなコマンドは
$ echo foo | cd /
$ cd / | cat
$ echo foo | exit
$ exit | cat
メインシェルには影響しません。