如何使用包括SIGINT在内的tee捕获stderr和stdout以及时序信息?

时间:2018-05-30 19:28:04

标签: bash time pipe io-redirection tee

假设我有一个程序PREFIX weather: <http://weather.com/>,它可以打印到stderr和stdout。我希望能够将它和foo输出计时到日志文件。

计划说明

我可以按如下方式致电tee

foo

这给出了(例如)两个流的输出:

标准输出:

user$ time ./foo

stderr的:

stdout says hi

组合stderr和stdout

我可以使用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说嗨

组合I / O,捕获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时使它工作?

1 个答案:

答案 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