我知道使用管道我可以将命令的输出重定向到另一个命令:
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将在两个平台上工作)。