$ cat pseudo-yes.sh
#!/bin/sh

while true; do
  printf "y\n"
done
$ 

上記のような、 pseudo-yes.shを記述しました。これを、例えば次のように使うと、問題無く yes コマンドのような動きをしてくれます。

$ ./pseudo-yes.sh | head -n 1
y
$ 

この挙動を見る限り、 printf コマンドの実行に際して発生するSIGPIPEシグナルは、 pseudo-yes.shが受信・処理しているはずだと理解できます。(でないと、 while文から抜け出せるはずがない)

自分の理解ですと、SIGPIPE シグナルは、 writeシステムコールを行ったプロセスに対して発行されるものはずだと思っています。

質問:

  • どうして、書き込みを行う主体のプロセスは printf なのに、pseudo-yes.shSIGPIPEを正しく処理できているのでしょうか?

補足:

  • この挙動は、 ubuntu と mac-os-x の両方で観測されました。