パイプされたプログラムはいつ終了し、誰がこの終了プロセスを制御しますか? Bashを読みました: なぜパイプが終了するのですか? しかし、この質問は部分的にしかカバーしていません。この質問に自分で答えようとした後、出力を確認するためにいくつかの例を作成しました。そして、これは私には理解できません: ( a.sh
):
#!/bin/bash
echoerr() { echo $@ 1>&2; }
echoerr a.sh started
sleep 1
echo 1
sleep 1
echo 2
sleep 1
echo 3
sleep 1 # Line 1
echo 4 # Line 2
echoerr a.sh finished
そして、私はそれを実行し./a.sh | head -3
ます。出力は次のとおりです。
a.sh started
1
2
3
出力から、最初の 3 行の入力を読み取った後、これ以上データが必要ないため、シグナル./a.sh
で終了したことがわかりました。SIGPIPE
しかし、行 1または行 2 のいずれかを削除すると、出力は次のように変わります。
a.sh started
1
2
3
a.sh finished
だから私の質問は:
- パイプされたプログラムを終了するポリシーは何ですか?
- 行 1 がプログラムの動作に影響を与えるのはなぜですか?
- 行 2 がプログラムの動作に影響を与えるのはなぜですか?