bash:更新后“time time cmd”无效

时间:2013-10-10 14:30:03

标签: bash time

我刚刚更新了我的bash,现在我无法使用在更新前工作正常的time time命令。

time time cmd的想法是:第一个time是bash内置函数,第二个time/usr/bin/time程序。 cmd是要定时的计划。

使用time time简短易记,可以看到精细打印的用户/系统/实时和页面错误统计信息:

$ time time false
Command exited with non-zero status 1
0.00user 0.00system 0:00.01elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (1major+163minor)pagefaults 0swaps

real    0m0.035s
user    0m0.000s
sys     0m0.002s

第一行是cmd的退出状态(如果非零),第二行是来自/usr/bin/time的紧凑时间统计,第三行是来自/usr/bin/time的具有pagefault统计数据的附加信息。然后有来自bash time的三行,有更详细的时间信息(点后3位)。

问题是:为什么较新的bash会将第二个time忽略为/ usr / bin / time?改变了什么,为什么?

如何修补bash以返回旧式的解析时间?

我认为bash的parse.y是bison文件的变化。这里是差异http://code.metager.de/source/diff/gnu/bash/parse.y?r2=%2Fgnu%2Fbash%2Fparse.y%40509a4430ae72aec10896713435e84f5b27675763&r1=%2Fgnu%2Fbash%2Fparse.y%4089a92869e56aba4e4cab2d639c00a86f0545c862

1 个答案:

答案 0 :(得分:1)

我不知道为什么这种行为在bash中发生了变化,但经过一番思考后,我已经建议如何让它恢复原状。

正如我在评论中所建议的那样,最简单的方法是创建一个别名:

alias time='time /usr/bin/time'

但这会改变行为,每次都使用“双倍时间”。我开始认为你可能想要指定它两次。当然,你可以将别名重命名为timetime并完成它。但是,如果仍然不够好,您可以通过向启动脚本添加函数和别名来恢复旧行为:

mytime() {
    if [ "$1" = "time" ]; then
        shift
        time /usr/bin/time $@
    else
        time $@
    fi
}
alias time=mytime

至少在我的电脑上,这很好用。