使用time工具时如何同时获取命令执行时长与执行结果?
解决方法
要同时获取命令执行结果和time的时长信息,关键是避免在子shell中执行命令(否则变量无法传递到当前shell),同时正确捕获time的输出(time默认输出到标准错误)。
步骤1:执行命令并捕获输出和时长
使用bash的块命令{ ...; }(而非子shell(...))来包裹命令,这样变量会在当前shell中生效:
# 执行ls命令,将输出保存到v变量,同时捕获time的输出到time_var time_var=$( { time v=$(ls); } 2>&1 ) # 从time_var中提取real时长到X X=$(echo "$time_var" | grep '^real')
步骤2:验证结果
分别输出变量X和v即可查看时长和命令结果:
echo "执行时长:$X" echo "命令输出:" echo "$v"
原理说明
v=$(ls):将ls的标准输出捕获到变量v中。{ time v=$(ls); }:在当前shell中执行time命令包裹的v=$(ls),time的输出默认发送到标准错误。2>&1:将块命令的标准错误重定向到标准输出,这样就能被$(...)捕获到time_var中。- 最后用
grep '^real'从time_var中提取出真实执行时长。
扩展:同时显示命令输出
如果希望在执行命令时直接看到输出(而不是只存在变量里),可以修改命令,让ls的输出同时发送到终端和变量:
# 同时显示ls输出并保存到v,再捕获time信息 time_var=$( { time v=$(ls | tee /dev/tty); } 2>&1 ) X=$(echo "$time_var" | grep '^real')
这样执行时会先显示文件列表,之后可以通过X和v获取时长和输出内容。
内容的提问来源于stack exchange,提问作者trzczy
相关产品推荐
相关产品推荐

