Редактировать 3:
Структура этого ответа:
- Не существует готового способа измерения времени для команды, которая уже была выполнена
- Существуют способы, позволяющие вывести приблизительную оценку продолжительности времени выполнения команды.
- Показано доказательство концепции (начиная с гипотезы, что это невозможно сделать, и заканчивая выводом о том, что гипотеза ошибочна).
- Существуют хаки, которые вы можете поставить на место заранее, которые будут записывать прошедшее время каждой команды, которую вы запускаете
- Заключение
Ответ, помеченный его частями в соответствии с приведенным выше планом:
Часть 1 - краткий ответ «нет»
Оригинал
Нет, извините. Вы должны использовать time
.
Часть 2 - может быть, вы можете вывести результат
В некоторых случаях, если программа записывает выходные файлы или информацию в файлы журналов, вы можете определить время выполнения, но это будет зависеть от программы и является лишь приблизительным. Если в Bash установлен HISTTIMEFORMAT, вы можете просмотреть записи в файле истории, чтобы получить представление о том, когда была запущена программа. Но время окончания не записывается, поэтому вы можете определить продолжительность только в том случае, если другая программа была запущена сразу после той, которая вас интересует.
Часть 3 - гипотеза опровергнута
Гипотеза : Время простоя будет учитываться в прошедшем времени
Edit:
Вот пример, иллюстрирующий мою точку зрения. Он основан на предложении ZyX , но будет аналогичен другим методам.
В zsh
:
% precmd() { prevstart=start; start=$SECONDS; }
% preexec() { prevend=$end; end=$SECONDS; }
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1491 ps: 1456 pe: 1458 s: 1459 e: 1491
Теперь мы ждем ... скажем, 15 секунд, затем:
% echo "T: $SECONDS"; sleep 10
T: 1506
Теперь мы ждем ... скажем, 20 секунд, затем:
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1536 ps: 1492 pe: 1506 s: 1516 e: 1536
Как видите, я был неправ . Время начала (1516) минус предыдущее время окончания (1506) составляет длительность команды (sleep 10
). Что также показывает, что переменным, которые я использовал в функциях, нужны более точные имена.
Гипотеза сфальсифицирована - это можно получить правильное истекшее время без учета времени простоя
Part 4 - хак для записи прошедшего времени каждой команды
Редактировать 2:
Вот эквиваленты Bash для функций в ответе ZyX (для них требуется скрипт, связанный с ним):
preexec () {
(( ${#_elapsed[@]} > 1000 )) && _elapsed=(${_elapsed[@]: -1000})
_start=$SECONDS
}
precmd () {
(( _start >= 0 )) && _elapsed+=($(( SECONDS-_start )))
_start=-1
}
После установки preexec.bash
(из связанного скрипта) и создания двух функций, приведенных выше, пример запуска будет выглядеть следующим образом:
$ _elapsed=() # Clear the times
$ sleep 10s
$ sleep 2s ; echo ${_elapsed[@]: -1}
10
$ echo ${_elapsed[@]}
0 10 2
часть 5 - заключение
Используйте time
.