我知道使用管道我可以将命令的输出重定向到另一个命令:
cmd1 | cmd2
当我使用类似的东西时:
cmd1 | cmd2 | cmd3
第二个管道使cmd3
获取cmd2
的输出。我的问题是:是否可以让cmd3
获取cmd1
的输出?
答案 0 :(得分:6)
您可以使用tee
:
cmd1 | tee >(cmd2) >(cmd3)
或pee
:
cmd1 | pee "cmd2" "cmd3"
默认情况下,应在所有类似Unix的系统中安装 tee
,而pee
包中可以找到moreutils
。
答案 1 :(得分:1)
您可以使用tee
和命名管道来执行此操作:
$ fifo=/tmp/1to3
$ mkfifo $fifo
$ cmd1 | tee $fifo | cmd2 & cmd3 <$fifo
答案 2 :(得分:0)
如果保证执行顺序 cmd2
和cmd3
和/或保证其输出顺序(如果有)是一个问题,使用进程替换(>(...)
)或命名管道(FIFO)不是一种选择
代替:
使用Radu Radeanu's answer中演示的pee
实用程序,如果安装它是一个选项(并且它适用于您的平台)。
否则,请按如下方式使用临时文件:
cmd1 | { f=$(mktemp) && cat >$f; cmd2 <$f; cmd3 <$f; rm $f; }
(在OSX上,使用mktemp -t tmp
而不只是mktemp
; mktemp -t XXXX
可以在两个平台上运行。