最下のTシャツ?

最下のTシャツ?

私はターミナルで遊んでいて、次のようにしました。

printf 'some string\n' | {
    tee /dev/fd/3 | {
        : && sed 's/some/string/'
    }
} 3>&0

全画面を見て本当に驚きました。

string string
string string
string string
...

それはほぼ永遠に続きます。より良いデモンストレーションのためにいくつかを切り取りました。以下を試してください。

echo | tee /dev/fd/0 | sed =

私にとっては、次のような出力をレンダリングします。

<num>
#blank
<num+1>
#blank
...

など。何度か試してみましたが、CTRL+を押すと、すでにC200,000行以上に達しました。bash、、、、でこれを試しましたがdashshすべてzsh同じ結果を示します。

そこで何が起こったの?|pipe別のプロセスと考えられるプロセス間でファイル記述子はどのように渡されますか?これは信頼できるか予想される動作ですか?この効果を生成する他の方法はありますか?

参考までに:

echo '#blank' | {
    uname -r
    readlink -f /dev/fd/0
    tee /dev/fd/0
} | sed '=;5q'

出力

1
3.14.6-1-ARCH
2
/proc/24925/fd/pipe:[5851017]
3
#blank
4
#blank
5
#blank

答え1

/dev/fd/0現在のプロセスの標準入力は、teeユーザーが提供するファイルと標準出力に入力を書き込みます。 1行(スペース)を読み取りtee、その行をstdout(sed)とそれ自身の入力に書き込みます。ここで書いた行を読み、それをstdoutや自己入力などに書き込みます。無限ループ(空)行を作成します*。このsedコマンドは行番号を印刷してからその行を印刷します。

echo --> tee --> sed
      ^---+

*単純な入力異常がある場合、echoこのコマンドは入力を繰り返し繰り返します。

注:OSX(BSD)では書き込みが許可されていないため、/dev/fd/0これはできません。

関連情報