command1 | command2
次のパイプラインで
- コマンドが同時に実行されるか(つまり、同じライフサイクルを持つか)または
- command1が終了すると、command2の実行が開始されます。または
- 他に何かありますか?
コマンドプロセスがプロセスグループを形成していると聞いたときに私の質問がありました。ライフサイクルが異なる場合、コマンドプロセスのプロセスグループは意味がないのではないでしょうか?
答え1
これらのプロセスはここに行く同時に同時に実行されますが、必ずしもそうする必要はありません。止める同時に。シェルは、次の場合にパイプライン全体が終了したと見なし、新しいプロンプトを表示します。両方プロセスが終了しました。
command2
do前に終了する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"状態で終了するようにします。