创建自定义接受行以测量命令在zsh中运行所花费的时间

时间:2017-10-27 08:55:55

标签: linux shell unix zsh zsh-zle

我想测量程序在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.是否有解决方法?

1 个答案:

答案 0 :(得分:0)

使用preexecprecmd 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毫秒),则会在提示中打印命令时间戳。