如何将(两个)管道指令的输出传递给文件?

时间:2016-04-18 14:10:26

标签: linux shell stdout pipeline

我有两个命令说cmd1和cmd2,其中我执行

time cmd1 | cmd2

我希望得到像

这样的东西
cmd1 >> file.out and {time cmd1 >> file.out} | cmd2 >> file.out

那么有人可以建议它是如何实际完成的吗? 编辑:正如安东尼的答案所示,tee在这里工作,但如果我写的话

time cmd1 |tee -a file.out | cmd2 >> file.out

然后它只将cmd1的输出写入file.out并将cmd2写入file.out,而我还希望将{time cmd1}的输出写入该文件。

我在Ubuntu Mate上使用bash shell。如果time关键字使其复杂化,请建议一些方法来计算执行时间并执行确切的操作。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您需要cmd的输出 写入file.out用作cmd2的输入。对于这种情况,您可以尝试将tee命令(带有-a选项附加)插入到命令管道中:

cmd1 | tee -a file.out | cmd2 >> file.out

实施例

$ printf "one\ntwo\nthree\n" | tee -a file.out | sed 's/.*/\U&/' >> file.out

$ cat file.out
one
two
three
ONE
TWO
THREE

回答问题的编辑版本

以下构造应该做你想要的:

{ time cmd1; }  2>> file.out | tee -a file.out | cmd2 >> file.out

由于time utility provided by Bash完整管道上运行,因此花括号用于group these commands,因此可以将它们视为一个整体。注意:在结束括号之前需要使用终止分号(;)。

cmd1的标准输出流经过tee命令,但由于Bash的time实用程序将其时间统计信息打印到标准错误,该文件重定向描述符2,以便将时间统计信息附加到file.out

先前示例的修改版

{ time printf "one\ntwo\nthree\n"; }  2>> file.out | tee -a file.out | sed 's/.*/\U&/' >> file.out