我想测量程序在zsh中运行所花费的时间。根据时差,我想打印出所用的时间。我为此编辑了接受行挂钩函数:
my-accept-line () {
CMD="$BUFFER"
CMDSTART=$(date +%s)
zle accept-line
CMDRUNTIME=$((($(date +%s)-${CMDSTART})))
if [[ $CMDRUNTIME -ge 100 ]]; then
CMDRUNTIME_min=$(($CMDRUNTIME/60))
echo "Last command ran for $CMDRUNTIME_min minutes."
fi
}
# create a widget from `my-accept-line' with the same name
zle -N my-accept-line
# rebind Enter, usually this is `^M'
bindkey '^M' my-accept-line
但问题是“zle accept-line”似乎在后台运行。因此,我总是将CMDRUNTIME设为0.是否有解决方法?
答案 0 :(得分:0)
使用preexec
和precmd
zsh挂钩最好不要这样做。
这是一个小例子(未经测试):
function pre_exec() {
cmd_timestamp=$((EPOCHREALTIME*1000))
}
function pre_cmd() {
local stop=$((EPOCHREALTIME*1000))
local start=${cmd_timestamp:-$stop}
local elapsed=$stop-$start
(($elapsed > 0)) && echo $elapsed
unset cmd_timestamp
}
zmodload zsh/datetime
autoload -Uz add-zsh-hook
add-zsh-hook precmd pre_cmd
add-zsh-hook preexec pre_exec
这将打印在提示之前以毫秒为单位运行命令所花费的时间 - 您可以更改pre_cmd函数以根据需要对其进行格式化。
有关功能更全面的示例,请查看我的ZSH提示主题filthy的来源,如果超过阈值(默认为500毫秒),则会在提示中打印命令时间戳。