sed/head と名前付きパイプ/FIFO の奇妙な動作 (2 回の書き込みが必要)

sed/head と名前付きパイプ/FIFO の奇妙な動作 (2 回の書き込みが必要)

mkfifoシェルからfifoを作成し、rwモードで開きましたexec 3<>fifo

別のシェルで実行しsed 1q <&3てfifoに1行を書き込むと、sedはfifoに別の行を書き込むまでその行を印刷しません。なぜこれが起こるのですか? (このようなことは起こらないでしょうhead -n1

答え1

これをシェルセッションからコピーできます。

(echo foo; sleep 3; echo bar) | busybox sed 1q

遅延後にのみ別々の出力ラインが現れることがわかります。

何が起こるかは、Busyboxの実装が$最初の行を処理する前に(最後の行)アドレス指定子が一致する必要があるかどうかを判断するために読み続けることです。パイプが閉じるまで、または2行目が表示されるまで、どのように解析するかを決定することは$できません。

これはすべてのsedでは発生しません。たとえば、私のMacのGNU sedとsedはすぐに最初の行を印刷します。スクリプトが使用されていないため、これを行うことができ、$必要なすべての情報がすでにそこにあります。スクリプトを次のように$変更した場合

(echo foo; sleep 3; echo bar) | sed -n '$!p'

2行目も待つ必要があります。

$おそらく、Busyboxはよりシンプルで使用されていることを確認せずに待つでしょう。

関連情報