によると:
{}
{ list; }
中かっこの間にコマンドリストを配置すると、そのリストは現在のシェルのコンテキストで実行されます。サブシェルは作成されません。。
ps
実際の効果を見るために使用されます
これは、コマンドラインから直接実行されるプロセスパイプラインのプロセス階層です。 4398はログインシェルのPIDです。
sleep 2 | ps -H;
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29696 pts/23 00:00:00 sleep
29697 pts/23 00:00:00 ps
次に、コマンドラインで直接実行される中括弧間のプロセスパイプラインのプロセス階層に従います。 4398はログインシェルのPIDです。上記の階層に似ており、すべてが現在シェルコンテキストで実行されていることを証明しています。:
{ sleep 2 | ps -H; }
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29588 pts/23 00:00:00 sleep
29589 pts/23 00:00:00 ps
これは、パイプライン自体が中かっこ内に配置されたときのプロセス階層ですsleep
(したがって、合計2つのレベルの中かっこがあります)。
{ { sleep 2; } | ps -H; }
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29869 pts/23 00:00:00 bash
29871 pts/23 00:00:00 sleep
29870 pts/23 00:00:00 ps
ドキュメントに中括弧間のコマンドが現在シェルのコンテキストで実行されていることが示されていますが、3bash
番目のケースで実行するサブシェルを作成する必要があるのはなぜですか?sleep
ベストアンサー1
パイプでは、すべてのコマンドが異なるプロセス(stdout / stdinがパイプを介して接続されている)で同時に実行されます。
存在する
cmd1 | cmd2 | cmd3
3つのコマンドはすべて異なるプロセスで実行されるため、少なくとも2つのコマンドはサブプロセスで実行する必要があります。一部のシェルは現在のシェルプロセスでそのうちの1つを実行します(組み込みの場合、またはパイプがスクリプトread
の最後のコマンドである場合)、bash
独自の別々のプロセスで実行されます(lastpipe
最新bash
バージョンのオプションと特定の条件を除く)。 )。
{...}
グループコマンド。グループがパイプラインの一部である場合は、単純なコマンドなどの別々のプロセスで実行する必要があります。
存在する:
{ a; b "$?"; } | c
a; b "$?"
これを別のプロセスとして評価するにはシェルが必要なので、サブシェルが必要です。 forb
はグループで実行される最後のコマンドなので、forを分岐しないことでシェルを最適化できます。一部のシェルはこれを行うことができますが、明らかにそうではありませんbash
。