将一个命令的输出redirect到多个命令

我知道使用pipe道,我可以将命令的输出redirect到另一个命令:

cmd1 | cmd2 

另外当我使用像这样的东西:

 cmd1 | cmd2 | cmd3 

第二个pipe道使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 

如果保证执行 cmd2cmd3 顺序和/或其输出的有保证顺序 (如果有的话),则使用进程替换( >(...) )或命名管道(FIFO)不是一个选项。
代替:

  • 如Radu Radeanu的答案中所示 ,使用pee工具,如果安装它是一个选项(并且它可用于您的平台)。

  • 否则,使用如下的临时文件

cmd1 | { f=$(mktemp) && cat >$f; cmd2 <$f; cmd3 <$f; rm $f; }

(在OSX上,使用mktemp -t tmp而不是mktemp ; mktemp -t XXXX可以在两个平台上运行)。