Есть ли способ распечатать время выполнения (время стены) в Zsh, когда оно превышает определенный настраиваемый порог?

1085
ktsujister

Комментарий @mpy был верным. Поэтому я перефразирую свой вопрос. Мне действительно нравится функция REPORTTIME в zsh, но она сообщает только время, когда пользовательское + системное время больше, чем $ REPORTTIME в соответствии с zsh doc . Есть ли способ сделать zsh отчетным временем, когда время стены больше некоторого числа, но не сообщать время, когда время стены меньше этого числа?

Исходный вопрос: мне действительно нравится функция REPORTTIME в zsh, но в соответствии с документом zsh он будет выводиться только тогда, когда результат команды не равен нулю. Но есть некоторые случаи, когда какая-то команда занимает некоторое время и терпит неудачу, и я хочу знать, сколько времени это заняло. Кто-нибудь знает способ распечатать время для команды, даже если результат не удался?

5
ИМХО, документ ("REPORTTIME` Если неотрицательный, ...") относится к самому `$ REPORTTIME`, а не к состоянию возврата команды. Обратите внимание, что пользовательское + системное время должно быть больше, чем $ REPORTTIME, а не настенное время. Поэтому `sleep 2` не сообщает статистику даже при` REPORTTIME = 1` mpy 10 лет назад 2
Спасибо за комментарии. Понятно ... Моя команда заняла более 10 минут и потерпела неудачу, поэтому я проверю с помощью команды времени, чтобы узнать, какое было время пользователя + системы в случае, если он не работал. ktsujister 10 лет назад 0

1 ответ на вопрос

9

Функциональность, по- 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 = $ - $" (( $elapsed > $REPORTTIME_TOTAL )) && print -P "%F$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 } 

К сожалению, эта команда дает только общее время выполнения. Он не разбивает время выполнения на пользовательское и системное время.

Похожие вопросы