head次のコマンドでcatを停止する方法:cat /dev/urandom | head -c 10

head次のコマンドでcatを停止する方法:cat /dev/urandom | head -c 10

次のように入力すると:

cat /dev/urandom

その後、データの出力に時間がかかりますが、次のようになります。

cat /dev/urandom | head -c 10

出力はランダムな10バイト後に終了します。これはhead、出力が何とか完了したことを意味しますかcat

答え1

リーダーを持たないパイプに書き込もうとすると、シグナルをcat受け取ります(そして終了すると自動的に標準入力を閉じます。これはパイプの読み取り端への唯一のオープンハンドルでもあります)。SIGPIPEhead

もしあなたなら何とかパイプの読み取り端に別のハンドルを持っていくと、猫は終わらないでしょう。詰まったパイプバッファを充填した後:

(Linux固有の例):

cat /dev/urandom 3</dev/stdout | head -c 10 > /tmp/junk
<staying there until you ^C>

また、到着catしたら無視するsignal SIGPIPE、信号を生成する書き込みは単に失敗し、=にSIGPIPE設定されます。errnoEPIPEBroken pipe ^1:

{ trap '' PIPE; cat /dev/urandom; } | head -c 10 >/tmp/junk
cat: write error: Broken pipe

このheadプロセスはこれとは何の関係もありません。しかし、実際にはそうではありません。シグナル指示するまたはまったく気にしないでくださいcat。必要なものは何でも読んで終了し、残りはすべてオペレーティングシステムに任せます。


^1この後者の動作(非常に迷惑な)はPythonスクリプトのデフォルト動作です。

python -c 'while 1: print("hello")' | head -n2
hello
hello
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe

関連情報