如何正确修改time命令的输入输出路径
如何正确修改time命令的输入输出路径
嗨,我来帮你搞定这个问题!你之前尝试的几个命令失效,核心原因是bash内置的time命令默认会把计时结果输出到标准错误(stderr),而不是标准输出(stdout)——普通的>重定向只能捕获stdout的内容,自然抓不到time的结果。下面给你几种靠谱的实现方式:
方式1:同时捕获命令输出和time结果到日志
如果想把echo hello的内容和time的计时信息都写入日志,可以把stderr重定向到stdout,再统一写入文件:
time echo hello > log 2>&1
这里的2>&1是把文件描述符2(stderr)的内容重定向到文件描述符1(stdout),这样两者的输出都会被>写入log文件。
方式2:只把time结果写入日志,命令输出留终端
要是你只想记录time的计时信息,让echo的内容依然显示在终端,可以用命令组单独重定向stderr:
{ time echo hello; } 2> log
注意大括号{}和命令之间要有空格,结尾的分号不能少——这样echo的stdout会正常输出到终端,而time的stderr会被写入log文件。
方式3:使用外部time命令(更灵活)
bash内置的time功能有限,如果你系统里有外部的time命令(可以用which time查看路径,一般是/usr/bin/time),可以直接用它的参数指定输出文件:
/usr/bin/time -o log echo hello
这个命令会直接把time的计时结果写入log,而echo的内容依然输出到终端;如果想同时把命令输出和time结果都写入日志,加上-a参数追加,再配合重定向:
/usr/bin/time -o log echo hello >> log
顺便解释下你之前的命令为什么失效:
time echo hello > log:只重定向了echo的stdout,time的stderr没被捕获,所以log里只有hello,time的结果会显示在终端。bash -c 'time echo hello' > log:子shell里的time输出还是stderr,>只重定向子shell的stdout,所以log里依然只有hello。echo $(time echo hello) > log:命令替换$(...)只会捕获stdout的内容,time的stderr不在其中,所以log里只有hello,time的结果还是会跑到终端,而且echo还会把原本的换行符去掉。
备注:内容来源于stack exchange,提问作者UnitedKingdom
相关产品推荐
相关产品推荐

