0

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

4

1 回答 1

0

你最好使用preexecand precmdzsh 钩子来做这件事。

这是一个小例子(未经测试):

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 函数以根据需要对其进行格式化。

举一个更全面的例子,看看 filthy 的来源我的 ZSH 提示主题,如果命令时间戳超过阈值(默认 500 毫秒),它会在提示中打印命令时间戳。

于 2017-11-02T12:33:44.560 回答