Есть ли способ распечатать время выполнения (время стены) в Zsh, когда оно превышает определенный настраиваемый порог?
Комментарий @mpy был верным. Поэтому я перефразирую свой вопрос. Мне действительно нравится функция REPORTTIME в zsh, но она сообщает только о времени, когда пользовательское + системное время больше, чем $REPORTTIME согласно zsh doc. Есть ли способ сделать zsh отчетным временем, когда время стены больше некоторого числа, но не сообщать время, когда время стены меньше этого числа?
Исходный вопрос: мне действительно нравится функция REPORTTIME в zsh, но в соответствии с документом zsh она будет выводиться только тогда, когда результат команды не равен нулю. Но есть некоторые случаи, когда какая-то команда занимает некоторое время и терпит неудачу, и я хочу знать, сколько времени это заняло. Кто-нибудь знает способ распечатать время для команды, даже если результат не удалось?
1 ответ
Функциональность REPORTTIME
представляется трудно закодированным для сравнения usertime+systime
, Соответствующий исходный код zsh для REPORTTIME
функциональность:
#ifdef HAVE_GETRUSAGE
reporttime -= j->procs->ti.ru_utime.tv_sec + j->procs->ti.ru_stime.tv_sec;
if (j->procs->ti.ru_utime.tv_usec +
j->procs->ti.ru_stime.tv_usec >= 1000000)
reporttime--;
return reporttime <= 0;
#else
{
clktck = get_clktck();
return ((j->procs->ti.ut + j->procs->ti.st) / clktck >= reporttime);
}
#endif
В качестве альтернативного решения вы можете изменить свой zshrc, чтобы получить функциональность simalar, чтобы иметь REPORTTIME
использовать общее время работы.
REPORTTIME_TOTAL=5
# Displays the execution time of the last command if set threshold was exceeded
cmd_execution_time() {
local stop=$((`date "+%s + %N / 1_000_000_000.0"`))
let local "elapsed = ${stop} - ${cmd_start_time}"
(( $elapsed > $REPORTTIME_TOTAL )) && print -P "%F{yellow}${elapsed}s%f"
}
# Get the start time of the command
preexec() {
cmd_start_time=$((`date "+%s + %N / 1.0e9"`))
}
# Output total execution
precmd() {
if (($+cmd_start_time)); then
cmd_execution_time
fi
}
К сожалению, эта команда дает только общее время выполнения. Он не разбивает время выполнения на пользовательское и системное время.