パイプラインのコマンドは同時に実行されますか? [コピー]

パイプラインのコマンドは同時に実行されますか? [コピー]

command1 | command2次のパイプラインで

  • コマンドが同時に実行されるか(つまり、同じライフサイクルを持つか)または
  • command1が終了すると、command2の実行が開始されます。または
  • 他に何かありますか?

コマンドプロセスがプロセスグループを形成していると聞いたときに私の質問がありました。ライフサイクルが異なる場合、コマンドプロセスのプロセスグループは意味がないのではないでしょうか?

答え1

これらのプロセスはここに行く同時に同時に実行されますが、必ずしもそうする必要はありません。止める同時に。シェルは、次の場合にパイプライン全体が終了したと見なし、新しいプロンプトを表示します。両方プロセスが終了しました。

command2do前に終了するcommand1か、標準入力ストリームを閉じてから出力を書き込もうとするcommand1と、その出力はどこにも行きません。その後、デフォルトの動作はabortのcommand1信号SIGPIPEを受け取りますcommand1。ただし、command1引き続き実行されるようにこのデフォルト値を上書きできます。この場合、出力に書き込もうとすると通常のI / Oエラー(EPIPE)が生成され、必要に応じて反応することがあります。

答え2

"|"` 別名 "パイプライン"....パイプラインを使用すると、あるプログラムの出力を別のプログラムの入力として使用できます。

user$ cat SHAHashing.java | grep main
    public static void main(String[] args)throws Exception

ご覧のとおり、catは最初にページの内容「THE OUTPUT」を表示するために実行され、次に文字列mainをgrepします。

CATそれでは、次のようにタイプミスを出したとしましょう。

user$ cats SHAHashing.java | grep main
-bash: cats: command not found

「無効なコマンド」出力がありません。 grepは実行されますが、何もしません。だから....catsは、最初のコマンドが "exit 1"状態で終了するようにします。

関連情報