これまで、パイプメカニズムが最後のコマンドに達するまで、1つのコマンドの標準出力を次のコマンドの標準入力に接続し、標準出力をモニターまたはファイルに接続して一連のコマンドを接続する方法です。
しかし、最後のコマンドのstdoutが最初のコマンドのstdinに接続されるようにコマンドを繰り返すことはできますか?そして、teeを使用すると、何らかの方法で特定の出力の変更値を表示できますか?
ベストアンサー1
これがすべてのシェルの場合であるかどうかはわかりませんが、Bashでは名前のないパイプを使用しなくても可能です。したがって、シンボルを使用する代わりに|
。ただし、名前付きパイプを作成する場合:
mkfifo fifo
その後、使用できます。
<fifo cat | cat >fifo &
パイプラインはバックグラウンドで実行されますが、何もしません。ただし、パイプがパイプの外部から供給される場合:
echo x >fifo
パイプラインは邪魔されずに永遠に続くでしょう。またはパイプを排水するまで:
cat fifo
出力は一度表示されます。
x
これをもう少し複雑にするために、パイプラインは次のようになります。
<fifo cat | xargs -I@ echo @x >fifo &
したがって、x
反復ごとに出力に1を追加します。もちろんそうです。ただし、繰り返しが開始された後、パイプがブロック解除されて何かを読み取ることができる場合にのみ可能です。以前と同様に手動で起動できます。
echo x >fifo
top
ここで表示された内容を見てください。cat
そしてかなり多くの活動があるでしょうxargs
。
x
以前のように配管を排水するとターミナルにsが多く見え、配管が詰まります。
これはパイプが排水される理由に関する有効な質問です。cat
端末に送信されたコマンドが回路に何も残らないのはなぜですか?私はこれを知らない。