パイプを使用して、コマンドの出力を別のコマンドにリダイレクトできることを知っています。
cmd1 | cmd2
また、次のようなものを使用する場合:
cmd1 | cmd2 | cmd3
2 番目のパイプはcmd3
、の出力を受け取るようにしますcmd2
。私の質問は:cmd3
の出力を取得することは可能cmd1
ですか?
パイプを使用して、コマンドの出力を別のコマンドにリダイレクトできることを知っています。
cmd1 | cmd2
また、次のようなものを使用する場合:
cmd1 | cmd2 | cmd3
2 番目のパイプはcmd3
、の出力を受け取るようにしますcmd2
。私の質問は:cmd3
の出力を取得することは可能cmd1
ですか?
使用できますtee
:
cmd1 | tee >(cmd2) >(cmd3)
またはpee
:
cmd1 | pee "cmd2" "cmd3"
tee
すべての Unix ライクなシステムにデフォルトでインストールする必要がありますが、パッケージpee
で見つけることができます。moreutils
tee
名前付きパイプでそれを行うことができます:
$ fifo=/tmp/1to3
$ mkfifo $fifo
$ cmd1 | tee $fifo | cmd2 & cmd3 <$fifo
プロセス置換 ( ) または名前付きパイプ (FIFO) の使用はオプションではありません。
その代わり:cmd2
cmd3
>(...)
インストールがオプションである場合 (およびプラットフォームで使用できる場合)、Radu Radeanu の回答pee
で示されているようにユーティリティを使用します。
それ以外の場合は、次のように一時ファイルを使用します。
cmd1 | { f=$(mktemp) && cat >$f; cmd2 <$f; cmd3 <$f; rm $f; }
(OSXmktemp -t tmp
では、単にmktemp
;の代わりに使用するとmktemp -t XXXX
、両方のプラットフォームで動作します)。