パイプを使用して、コマンドの出力を別のコマンドにリダイレクトできることを知っています。
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) の使用はオプションではありません。
その代わり:cmd2cmd3>(...)
インストールがオプションである場合 (およびプラットフォームで使用できる場合)、Radu Radeanu の回答peeで示されているようにユーティリティを使用します。
それ以外の場合は、次のように一時ファイルを使用します。
cmd1 | { f=$(mktemp) && cat >$f; cmd2 <$f; cmd3 <$f; rm $f; }
(OSXmktemp -t tmpでは、単にmktemp;の代わりに使用するとmktemp -t XXXX、両方のプラットフォームで動作します)。