2 つの tmp ファイル (必要なものではない) を含む 1 行は次のようになります。
foo | bar > file1.txt && baz | quux > file2.txt && diff file1.txt file2.txt
ただし、 bashを使用すると、次のことを試すことができます。
diff <(foo | bar) <(baz | quux)
foo | bar | diff - <(baz | quux) # or only use process substitution once
-- /dev/stdin
2 番目のバージョンでは、2 つの番号付き fd の代わりにvs.++ /dev/fd/63
または何かを表示することで、どの入力がどれであったかをより明確に思い出させます。
名前付きパイプでさえファイルシステムに表示されません.少なくともbashがファイル名を使用してプロセス置換を実装できるOSでは/dev/fd/63
、コマンドが開いて読み取ることができるファイル名を取得して、bashが設定したすでに開いているファイル記述子から実際に読み取ることができます.コマンドを実行する前にアップします。(つまり、bash はpipe(2)
fork の前に使用し、fd 63 での出力から の入力ファイル記述子にdup2
リダイレクトします。)quux
diff
「魔法の」/dev/fd
またはのないシステムでは/proc/self/fd
、bashは名前付きパイプを使用してプロセス置換を実装する場合がありますが、一時ファイルとは異なり、少なくともそれら自体を管理し、データはファイルシステムに書き込まれません.
echo <(true)
ファイル名から読み取る代わりにファイル名を出力するために、bashがプロセス置換を実装する方法を確認できます。/dev/fd/63
典型的な Linux システムで印刷されます。または、bash が使用するシステム コールの正確な詳細については、Linux システムでこのコマンドを実行すると、ファイルおよびファイル記述子システム コールがトレースされます。
strace -f -efile,desc,clone,execve bash -c '/bin/true | diff -u - <(/bin/true)'
bash がなければ、名前付きパイプを作成できます。STDIN から 1 つの入力を読み取り、名前付きパイプをもう 1 つの入力として使用-
するように指示するために使用します。diff
mkfifo file1_pipe.txt
foo|bar > file1_pipe.txt && baz | quux | diff file1_pipe.txt - && rm file1_pipe.txt
tee コマンドでは、1 つの出力のみを複数の入力にパイプできることに注意してください。
ls *.txt | tee /dev/tty txtlist.txt
上記のコマンドは、ls *.txt の出力をターミナルに表示し、テキスト ファイル txtlist.txt に出力します。
ただし、プロセス置換を使用tee
すると、同じデータを複数のパイプラインにフィードするために使用できます。
cat *.txt | tee >(foo | bar > result1.txt) >(baz | quux > result2.txt) | foobar