我有两个命令说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关键字使其复杂化,请建议一些方法来计算执行时间并执行确切的操作。
答案 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