От 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
Вы можете использовать этот заимствованный из zsh хук для bash: http://www.twistedmatrix.com/users/glyph/preexec.bash.txt
Время выполнено с этим hook (Mac OS X): Используйте Growl для отслеживания длительно выполняющихся команд оболочки
Это минимальный автономный код для достижения того, чего вы хотите:
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]$ '
Сработает ли для вас установка \ 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
Другой минимальный подход:
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:». Настроить по вкусу.
Если вы не настроили ни один из других ответов до того, как начали свою длительную работу, и вы просто хотите знать, сколько времени заняла работа, вы можете выполнить простой
$ HISTTIMEFORMAT="%s " history 2
, и он ответит чем-то вроде
654 1278611022 gvn up
655 1278611714 HISTTIMEFORMAT="%s " history 2
, а затем вы можете просто визуально вычесть две временные метки (кто-нибудь знает, как захватить вывод команды истории встроенной оболочки?)