将一个命令的输出重定向到多个命令

时间:2013-11-11 17:12:41

标签: linux bash command-line io-redirection

我知道使用管道我可以将命令的输出重定向到另一个命令:

cmd1 | cmd2

当我使用类似的东西时:

cmd1 | cmd2 | cmd3

第二个管道使cmd3获取cmd2的输出。我的问题是:是否可以让cmd3获取cmd1的输出?

3 个答案:

答案 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)

如果保证执行顺序 cmd2cmd3和/或保证其输出顺序(如果有)是一个问题,使用进程替换(>(...))或命名管道(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可以在两个平台上运行。