5

私がこれを行うとき:

find . -name "pattern" | grep "another-pattern"

プロセスfindgrepは一緒に生成されていますか? 私の推測ではイエスです。もしそうなら、これはどのように機能しますか?:

yes | command_that_prompts_for_confirmations

yesが継続的に「y」を標準出力に送信し、標準入力をcommand_that_prompts_for_confirmations読み取るたびに「y」を読み取る場合、いつ終了するかをどうやって知るのでしょyesうか? yes出力を他のコマンドにパイプせずに単独で実行すると、決して終了しないためです。

しかし、パイプ コマンドですべてのプロセスが同時に生成されない場合、yes出力する 'y' の数をどうやって知るのでしょうか? ここは私にとってキャッチ22です。このパイピングが *NIX でどのように機能するか説明してもらえますか?

4

4 に答える 4

11

ウィキペディアのページから: 「それ自体では、yes コマンドは 'y' または引数として指定されたものを出力し、その後に改行が続き、ユーザーによって停止されるか、その他の方法で強制終了されます。コマンドにパイプされると、パイプが終了するまで続行されます。中断します (つまり、プログラムはその実行を完了します)。」

yesいつ終了するかを「知りません」。ただし、ある時点で「y」を stdout に出力すると、他のプロセスが終了したためにエラーが発生し、パイプが壊れて yes が終了します。

シーケンスは次のとおりです。

  1. 他のプログラムが終了する
  2. オペレーティング システムがパイプを閉じる
  3. はい文字を出力しようとします
  4. エラーが発生する (壊れたパイプ)
  5. はい終了します
于 2009-02-19T13:52:09.580 に答える
4

他の回答は終了をカバーしています。もう1つの側面は、yesは限られた数のyのみを出力することです。パイプにはバッファーがあり、それがいっぱいになると、yesは書き込み要求をブロックします。したがって、yesは無限のCPU時間を消費しません。

于 2009-02-19T14:44:48.283 に答える
3

最初のプロセスの stdout は 2 番目のプロセスの stdin に接続され、以下同様です。2 番目のプロセスが終了すると、書き込み先の stdout がなくなるため、「yes」は終了します。

于 2009-02-19T13:52:18.737 に答える