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
2番目のバージョンでは、2つの番号が付けられたfdsの代わりに、
-- /dev/stdin
vs ++ /dev/fd/63
か何かを表示することにより、どちらの入力かをより明確に思い出させます。
名前付きパイプもファイルシステムに表示されません。少なくともbashがファイル名を使用してプロセス置換を実装できるOS /dev/fd/63
では、コマンドは開いて読み取ることができるファイル名を取得し、bashが設定したすでに開いているファイル記述子から実際に読み取ることができます。コマンドを実行する前に起動します。(つまり、bashはfordのpipe(2)
前に使用し、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
mkfifo a; cmd >a& cmd2|diff a -; rm a