Подтвердить что ты не робот

Есть ли способ найти время выполнения последней выполненной команды в оболочке?

Есть ли команда типа time, которая может отображать детали времени выполнения последних или прошлых запущенных команд в оболочке?

4b9b3361

Ответ 1

Я не знаю, как это делается в bash, но в zsh вы можете определить функции preexec и precmd, чтобы они сохраняли текущее время для переменных $STARTTIME (preexec) и $ENDTIME ( precmd), чтобы вы могли найти приблизительное время работы. Или вы можете определить функцию accept-line, чтобы она до начала time перед каждой командой.

UPDATE: Это код, который будет хранить истекшее время в массиве $_elapsed:

preexec () {
   (( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
   typeset -ig _start=SECONDS
}
precmd() { set -A _elapsed $_elapsed $(( SECONDS-_start )) }

Затем, если вы запустите sleep 10s:

% set -A _elapsed # Clear the times
% sleep 10s
% sleep 2s ; echo $_elapsed[-1]
10
% echo $_elapsed
0 10 0

Нет необходимости в четырех переменных. Нет проблем с именами или дополнительными задержками. Просто обратите внимание, что массив $_elapsed может расти очень большой, поэтому вам нужно удалить первые элементы (это делается с помощью следующего фрагмента кода: (( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]).

UPDATE2: Найден script для поддержки zm-стиля premd и preexec в bash. Возможно, вам нужно будет удалить typeset -ig (я использовал просто, чтобы $_start был целым числом) и заменил set -A var ... на var=( ... ), чтобы заставить это работать. И я не знаю, как разрезать массивы и получить их длину в bash.

Script: http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

Update3: Найдена одна проблема: если вы нажмете return с пустой строкой, preexec не запустится, а precmd сделает, поэтому вы получите бессмысленные значения в массиве $_elapsed. Чтобы исправить это, замените функцию precmd на следующий код:

precmd () {
   (( _start >= 0 )) && set -A _elapsed $_elapsed $(( SECONDS-_start ))
   _start=-1 
}

Ответ 2

Изменить 3:

Структура этого ответа:

  • Нет готового способа выполнить команду, которая уже была запущена
  • Существуют способы, которыми вы можете определить срок действия времени выполнения команды.
  • Доказательство концепции показано (начиная с гипотезы, что это невозможно сделать и заканчивая тем, что гипотеза была неправильной).
  • Есть взломы, которые вы можете ввести перед собой, чтобы записать прошедшее время каждой команды, которую вы запускаете.
  • Заключение

Ответ, обозначенный его частями в соответствии с вышеприведенным планом:

Часть 1 - короткий ответ "нет"

Оригинал

Нет, извините. Вы должны использовать time.

Часть 2 - возможно, вы можете вывести результат

В некоторых случаях, если программа записывает выходные файлы или информацию в файлы журналов, вы могли бы определить время выполнения, но это было бы специфично для программы и было бы только guesstimate. Если у вас установлен HISTTIMEFORMAT в Bash, вы можете посмотреть записи в файле истории, чтобы получить представление о запуске программы. Но время окончания не регистрируется, поэтому вы можете вывести только продолжительность, если другая программа была запущена сразу после того, как вы заинтересованы в завершении.

Часть 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). Что также показывает, что переменные, которые я использовал в функциях, нуждаются в более лучших именах.

Гипотеза фальсифицирована - она ​​ позволяет получить правильное истекшее время без включения времени простоя

Часть 4 - взлом для записи прошедшего времени каждой команды

Изменить 2:

Вот эквиваленты Bash для функций в ответе ZyX (им нужен связанный с ним script):

preexec () {
   (( ${#_elapsed[@]} > 1000 )) && _elapsed=(${_elapsed[@]: -1000})
   _start=$SECONDS
}

precmd () {
   (( _start >= 0 )) && _elapsed+=($(( SECONDS-_start )))
   _start=-1 
}

После установки preexec.bash (из связанного script) и создания двух функций выше, пример будет выглядеть следующим образом:

$ _elapsed=() # Clear the times
$ sleep 10s
$ sleep 2s ; echo ${_elapsed[@]: -1}
10
$ echo ${_elapsed[@]}
0 10 2

Часть 5 - заключение

Используйте time.

Ответ 3

Я так понимаю, вы выполняете команды, которые занимают много времени и не понимают вначале, что вы хотели бы, сколько времени потребуется для завершения. В zsh, если вы установите переменную среды REPORTTIME в число, любая команда, занимающая дольше, чем это количество секунд, будет иметь время, когда оно было напечатано, как будто вы запустили его с помощью команды времени перед ней. Вы можете установить его в своем .zshrc, чтобы длинные команды всегда печатали свое время. Обратите внимание, что время, затрачиваемое на спящий режим (в отличие от времени пользователя/системы), не учитывается для запуска таймера, но по-прежнему отслеживается.

Ответ 4

Мир, возможно, немного изменился, так как другие люди ответили на эти вопросы.

zsh имеет некоторые встроенные функции во времени, как долго выполняются команды.

Если вы включите опцию inc_append_history_time с

setopt inc_append_history_time

Затем время, затрачиваемое на выполнение каждой команды, сохраняется в вашей истории, а затем можно просмотреть с помощью history -D.

Ответ 5

Я думаю, вы можете получить статистику времени только для команд, которые вы запускаете, используя команду "время".

На странице man:

время [опции] команда [arguments...]

ОПИСАНИЕ        Команда time запускает указанную команду программы с данными аргументами. Когда команда заканчивается,        время записывает сообщение в стандартную ошибку, дающую статистику времени об этой программе.