2

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

cmd1 | cmd2

另外,当我使用类似的东西时:

cmd1 | cmd2 | cmd3

第二个管道使其cmd3输出cmd2. 我的问题是:是否有可能cmd3获取输出cmd1

4

3 回答 3

6

您可以使用tee

cmd1 | tee >(cmd2) >(cmd3)

pee

cmd1 | pee "cmd2" "cmd3"

tee应该默认安装在所有类 Unix 系统中,而pee可以在 package.json 中找到moreutils

于 2013-11-11T17:15:17.923 回答
1

您可以使用tee命名管道来执行此操作:

 $ fifo=/tmp/1to3
 $ mkfifo $fifo
 $ cmd1 | tee $fifo | cmd2 & cmd3 <$fifo
于 2013-11-11T17:14:52.263 回答
0

如果有保证的执行顺序cmd2/cmd3保证的输出顺序(如果有)是一个问题,>(...)则不能使用进程替换()或命名管道(FIFO)。
反而:

  • 如果安装它是一个选项(并且它适用于您的平台),请使用Radu Radean 的回答pee中演示的实用程序。

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

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

(在 OSX 上,使用mktemp -t tmp而不是只使用mktemp;mktemp -t XXXX将在两个平台上工作)。


于 2014-12-09T04:24:22.063 回答