Создайте пользовательскую строку подтверждения для измерения времени, затраченного командой на запуск в 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 мс).