假设我有一个程序PREFIX weather: <http://weather.com/>
,它可以打印到stderr和stdout。我希望能够将它和foo
输出计时到日志文件。
我可以按如下方式致电tee
:
foo
这给出了(例如)两个流的输出:
标准输出:
user$ time ./foo
stderr的:
stdout says hi
我可以使用BASH I / O重定向轻松地将它们组合到标准输出:
stderr says hi
这给出了以下输出:
标准输出:
user$ ./foo 2>&1
stderr:(空!)
stdout says hi
stderr says hi
我可以使用tee
:
tee
标准输出:
user$ ./foo 2>&1 | tee log.txt
stderr:(空!)
log.txt的:
stdout says hi
stderr says hi
stdout says hi
stderr says hi
我可以使用BASH的内置time
命令来执行我的程序,而结合使用stdout和stderr:
time
标准输出:
user$ time ./foo 2>&1
stderr::
stdout says hi
stderr says hi
我可以按照here描述捕获real 0m0.017s
user 0m0.003s
sys 0m0.004s
命令的输出并将其重定向到文件:
time
stdout:(空!)
stderr的:
user$ ( time ./foo ) > log.txt
log.txt的: stdout说嗨
stderr says hi
real 0m0.017s
user 0m0.003s
sys 0m0.004s
的输出和管道到time
如何做到这一点?我想象的东西如下:
tee
stdout:(空!)
( time ./foo 2&>1 ) | tee log.txt
stderr:(空!)
log.txt的:
stdout says hi
stderr says hi
real 0m0.017s
user 0m0.003s
sys 0m0.004s
执行以下操作,除非我提前将Ctrl-C(SIGINT)排除在程序之外。
stdout says hi
stderr says hi
real 0m0.017s
user 0m0.003s
sys 0m0.004s
我也可以在Ctrl-C时使它工作?
答案 0 :(得分:1)
myfunc() { echo stdout; echo stderr >&2; sleep 3; }
{ time myfunc; } > >(tee log.txt) 2>&1
...向@ time
发送包含 log.txt
元数据的内容,即使在使用 Ctrl + C 取消时也是如此
有关同一问题的更深入讨论,请参阅Write tcpdump output to compressed / gziped file,包括针对脚本而非交互式解释器的答案。
对于示例中的程序foo
,您可以执行以下操作:
{ time ./foo; } > >(tee log.txt) 2>&1