我知道使用管道我可以将命令的输出重定向到另一个命令:
cmd1 | cmd2
另外,当我使用类似的东西时:
cmd1 | cmd2 | cmd3
第二个管道使其cmd3
输出cmd2
. 我的问题是:是否有可能cmd3
获取输出cmd1
?
我知道使用管道我可以将命令的输出重定向到另一个命令:
cmd1 | cmd2
另外,当我使用类似的东西时:
cmd1 | cmd2 | cmd3
第二个管道使其cmd3
输出cmd2
. 我的问题是:是否有可能cmd3
获取输出cmd1
?
您可以使用tee
:
cmd1 | tee >(cmd2) >(cmd3)
或pee
:
cmd1 | pee "cmd2" "cmd3"
tee
应该默认安装在所有类 Unix 系统中,而pee
可以在 package.json 中找到moreutils
。
您可以使用tee
命名管道来执行此操作:
$ fifo=/tmp/1to3
$ mkfifo $fifo
$ cmd1 | tee $fifo | cmd2 & cmd3 <$fifo
如果有保证的执行顺序和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
将在两个平台上工作)。