19

10文字のパスワードをランダムに生成するためのシェルパイプラインがあります。

cat /dev/urandom | base64 | head -c 10

私の質問はcat /dev/urandom | base64、それ自体では終了しない無限の出力ストリームです。しかし、なぜ追加head -c 10するとパイプライン全体が終了するのでしょうか。cat私は、 3つの別々のプロセスであるbase64と仮定headしますが、どのようにしてプロセスを終了さheadせることができますか?cat

4

3 に答える 3

23

head必要な量を読み取った後、入力ファイルを閉じます。パイプが片側から閉じられると、反対側で書き込みエラーが発生します。これによりbase64閉じられ、さらにcat閉じられます。

于 2012-04-05T15:22:17.843 に答える
13

base6410 バイトを出力した後、head十分な入力を取得して終了します。前者がさらにバイトを出力しようとすると、SIGPIPE シグナルを受信するため、終了します。同じ理由で、cat順番に終了します。

于 2012-04-06T13:15:51.513 に答える
4

配管は、1つのプロセスAの出力をBの入力に接続することによって機能します。接続が切断される可能性がある場合

  • Aはその出力を閉じます。BはEOFを取得します。
  • Bは入力を閉じます。次のバイトを書き込もうとすると、出力が使用できなくなるというエラーが発生します。

これらの2つのケースは非常に一般的であるため、処理はC標準ライブラリに移動されました。

于 2012-04-05T15:23:27.873 に答える