我不知道如何在bash中,但是在zsh中,您可以定义preexec和precmd函数,以便将当前时间保存到变量$ STARTTIME(preexec)和$ ENDTIME(precmd),以便您可以找到近似值运行时间。或者您可以定义一个接受函数,以便在每个命令之前添加时间。
更新:
这是代码,它将在$ _elapsed数组中存储已用时间:
preexec () {
(( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
typeset -ig _start=SECONDS
}
precmd() { set -A _elapsed $_elapsed $(( SECONDS-_start )) }
那么如果你运行睡眠10s:
% set -A _elapsed # Clear the times
% sleep 10s
% sleep 2s ; echo $_elapsed[-1]
10
% echo $_elapsed
0 10 0
不需要四个变量。没有名称或额外延误的问题。请注意,$ _elapsed数组可能会变得非常大,因此您需要删除第一个项目(这是通过以下代码完成的:(($#_ elapsed> 1000))&&& set -A _elapsed $ _elapsed [-1000,-1])。
UPDATE2:
在bash中找到支持zsh-style precmd和preexec的脚本。也许你需要删除typeset -ig(我只是强制$ _start为整数),并用var =(…)替换set -A var …以获得此工作。而且我不知道如何对数组进行切片并将其长度限制在bash中。
UPDATE3:
发现一个问题:如果您使用空行命令返回preexec不运行,而precmd则会在$ _elapsed数组中获得无意义的值。为了解决此问题,请使用以下代码替换precmd函数:
precmd () {
(( _start >= 0 )) && set -A _elapsed $_elapsed $(( SECONDS-_start ))
_start=-1
}