Как может стенное время последней команды быть помещенным в подсказку Bash?

От Ruby 1.9 Proc# === псевдоним к Proc#call, что означает, что объекты Proc могут использоваться в случае, если операторы как так:

def multiple_of(factor)
  Proc.new{|product| product.modulo(factor).zero?}
end

case number
  when multiple_of(3)
    puts "Multiple of 3"
  when multiple_of(7)
    puts "Multiple of 7"
end
60
задан Mr Fooz 18 February 2013 в 19:55
поделиться

5 ответов

Вы можете использовать этот заимствованный из zsh хук для bash: http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

Время выполнено с этим hook (Mac OS X): Используйте Growl для отслеживания длительно выполняющихся команд оболочки

10
ответ дан 24 November 2019 в 17:34
поделиться

Это минимальный автономный код для достижения того, чего вы хотите:

function timer_start {
  timer=${timer:-$SECONDS}
}

function timer_stop {
  timer_show=$(($SECONDS - $timer))
  unset timer
}

trap 'timer_start' DEBUG
PROMPT_COMMAND=timer_stop

PS1='[last: ${timer_show}s][\w]$ '
97
ответ дан 24 November 2019 в 17:34
поделиться

Сработает ли для вас установка \ t в PS1?

Это не дает информацию о затраченном времени, но должно быть достаточно легко вычесть время, когда это необходимо.

$ export PS1='[\t] [\w]\$ '
[14:22:30] [/bin]$ sleep 10
[14:22:42] [/bin]$

Следуя OP прокомментируйте, что он уже использует \ t. Если вы можете использовать tcsh вместо bash, вы можете установить временную переменную.

/bin 1 > set time = 0
/bin 2 > sleep 10
0.015u 0.046s 0:10.09 0.4%      0+0k 0+0io 2570pf+0w
/bin 3 >

Вы можете изменить формат печати, чтобы он был менее уродливым (см. Страницу руководства tcsh).

/bin 4 > set time = ( 0 "last: %E" )
/bin 5 > sleep 10
last: 0:10.09
/bin 6 >

Я не знаю аналогичного средства в bash

0
ответ дан 24 November 2019 в 17:34
поделиться

Другой минимальный подход:

trap 'SECONDS=0' DEBUG
export PS1='your_normal_prompt_here ($SECONDS) # '

Показывает количество секунд с момента запуска последней простой команды. Счетчик не сбрасывается, если вы просто нажимаете Enter, не вводя команду, что может быть удобно, когда вы просто хотите узнать, сколько времени терминал работал с тех пор, как вы в последний раз что-либо в нем сделали. У меня он отлично работает в Red Hat и Ubuntu. У меня это НЕ сработало под Cygwin, но я не уверен, является ли это ошибкой или просто ограничением попытки запустить Bash под Windows.

Одним из возможных недостатков этого подхода является то, что вы продолжаете сбрасывать SECONDS, но если вам действительно нужно сохранить SECONDS как количество секунд с момента первоначального вызова оболочки, вы можете создать свою собственную переменную для счетчика PS1 вместо использования SECONDS напрямую. Другой возможный недостаток заключается в том, что большое значение секунд, такое как «999999», может быть лучше отображено как дни + часы + минуты + секунды, но легко добавить простой фильтр, например:

seconds2days() { # convert integer seconds to Ddays,HH:MM:SS
  printf "%ddays,%02d:%02d:%02d" $(((($1/60)/60)/24)) \
  $(((($1/60)/60)%24)) $((($1/60)%60)) $(($1%60)) |
  sed 's/^1days/1day/;s/^0days,\(00:\)*//;s/^0//' ; }
trap 'SECONDS=0' DEBUG
PS1='other_prompt_stuff_here ($(seconds2days $SECONDS)) # '

Это переводит «999999» в «11 дней». , 13:46:39 ". Команда sed в конце изменяет «1days» на «1day» и обрезает пустые ведущие значения, такие как «0days, 00:». Настроить по вкусу.

11
ответ дан 24 November 2019 в 17:34
поделиться

Если вы не настроили ни один из других ответов до того, как начали свою длительную работу, и вы просто хотите знать, сколько времени заняла работа, вы можете выполнить простой

$ HISTTIMEFORMAT="%s " history 2

, и он ответит чем-то вроде

  654  1278611022 gvn up
  655  1278611714 HISTTIMEFORMAT="%s " history 2

, а затем вы можете просто визуально вычесть две временные метки (кто-нибудь знает, как захватить вывод команды истории встроенной оболочки?)

6
ответ дан 24 November 2019 в 17:34
поделиться
Другие вопросы по тегам:

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