1

パイプされたプログラムはいつ終了し、誰がこの終了プロセスを制御しますか? 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 がプログラムの動作に影響を与えるのはなぜですか?
4

1 に答える 1

2

あなたが言ったように、閉じたパイプに書き込もうとすると、シェルスクリプトは死んでしまいます。そうでない場合はそうではありません。

2 行目を削除すると、 aftera.shへの書き込みが試行されないため、失敗する理由はありません。stdoutecho 3

最初の行を削除しても、テストを実行するたびに同じ結果が得られるとは限りません。タイミングの問題があります。最後の 2 つのechoステートメントがhead入力からの読み取りを試行する前に処理された (そして 3 行に達したために終了した) 場合a.sh、壊れたパイプ エラーは発生しません。タイミングが2 つの のhead間で読み取りを行うようなものである場合、パイプ エラーが発生し、終了します。echoa.sh

于 2013-07-28T11:18:01.067 に答える