(明らかに)tmpファイルを生成する以外に、cmd1 > tmp && cmd2 < tmp
?との違いは何ですか?cmd1 | cmd2
cmd2
パイプの私の理解が正確であれば、以下を読んでみたいです。標準入力どちらの場合も出力されるため、cmd1
どちらの場合も同じ動作が期待されます。
しかしこの囲碁プログラム標準入力を読み取ると、パイプで期待どおりに機能しますが、2番目の形式では入力が受信されていないかのように動作します。
答え1
囲碁プログラムが見える明らかに標準入力がパイプかどうかをテストし、そうでない場合は診断メッセージで終了します。
fi, err := os.Stdin.Stat()
if err != nil {
fatal(err)
}
if fi.Mode()&os.ModeNamedPipe == 0 {
usage()
os.Exit(1)
}
2つのコマンドラインの別の違いは、パイプを使用するときに2つのコマンドが同時に実行されることです。左のコマンドは書き込み、右のコマンドは読み取りです。あるプログラムが他のプログラムよりも読み書きの面で遅すぎると、遅いプログラムが追いつくまで、より速いプログラムが一時的にブロックされます。
&&
2つのコマンドが途中で実行される場合、明らかに互いに後で実行されます。 2番目のコマンドは、最初のコマンドが完了してゼロ終了状態で終了するまで開始されません。