5

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

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

1 ответ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 = ${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
}

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .