Создайте пользовательскую строку подтверждения для измерения времени, затраченного командой на запуск в zsh.

Я хочу измерить время, необходимое программе для запуска в Zsh. Исходя из разницы во времени, я хочу распечатать время. Для этого я отредактировал функцию ловушки accept-line:

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 ответ

Вам лучше сделать это, используя preexec а также precmd зш крючки.

Вот небольшой пример (не проверенный):

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, которая печатает временные метки команд в приглашении, если они превышают пороговое значение (по умолчанию 500 мс).

Другие вопросы по тегам