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

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

私は通常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はプログラムがターミナルに書き込んでいる場合はライン単位で出力をバッファリングし、ターミナルに書き込まない場合はブロック単位で出力をバッファリングします。

stdbufLinuxでは、glibcを使用して以下のコマンドを使用してこの動作に影響を与えることができます。

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

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

答え3

-usedのオプションを使用してバッファリングを最小限に抑えることができます。

cat | sed -u '' | sed ''

関連情報