パイプと無限ストリームはどのように機能しますか?

パイプと無限ストリームはどのように機能しますか?

私は通常command1 | command2 | command3Linux でよく使用しますが、そのほとんどは明確なコンテンツを扱っています。

これを無限ストリームで試してみたところcat | sed '' | sed ''、無限ストリームをシミュレートできるはずですが、 で終了するまで機能しませんでしたCtrl-D。 を使用すると問題は解決できますcat | sed -e '' -e ''が、最初の方法が機能しない理由を知りたいです。cat | cat | catは問題なく機能します。 と関係があるのでしょうか。sedもしそうなら、その問題は何でしょうか。

私はこの問題について考えてみたのですが、唯一違うのは、使用中にキーcatを押しても、上記のEnter最初のケースでは起こっていない特別な動作をするということだけです。sed ''

無限の蒸気でパイプをシームレスに動作させる方法を教えてください。

答え1

パイプは、出力または左側のコマンドを右側のコマンドの入力に接続します。これはストリームの長さとは関係ありません。ただし、パイプライン内の各コマンドには独自のバッファリング ルールがあります。各コマンドでそれらをトリガーしないと、最終出力には表示されません。

答え2

それは基本的にSOでの私の答えただし、stdbufここでそのコマンドについて言及している人は誰もいなかったので、ここでも追加する必要があると感じました。

===============

基本的に、パイプから読み取るプロセスは、パイプでデータが利用可能になるとすぐに、データをバイト単位で消費できます。ただし、プログラムが読み取り、書き込みなどの libc の std io 関数を使用している限り、プログラムが端末に書き込んでいるかどうかに応じて、libc はそれらのプログラムの入力/出力をバッファリングします。

デフォルトでは、プログラムが端末に書き込む場合、libc は出力を行単位でバッファリングし、端末に書き込まない場合はブロック単位でバッファリングします。

Linux では、glibc を使用すると、stdbuf次のようにコマンドを使用してその動作に影響を与えることができます。

stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''

コマンドには行ベースの出力バッファを使用しcat、最初のコマンドには行ベースの入力および出力バッファを使用しsed、最後のsedコマンドには行ベースの入力バッファを使用しています。

答え3

-uバッファリングを最小限に抑えるには、sed のオプションを使用できます。

cat | sed -u '' | sed ''

関連情報