Блоки инициализации выполняются всякий раз, когда класс инициализируется и перед вызовом конструкторов. Они обычно размещаются над конструкторами в фигурных скобках. Не обязательно включать их в свои классы.
Они обычно используются для инициализации ссылочных переменных. Эта страница дает хорошее объяснение
Вы можете использовать этот zsh-заимствованный крючок для bash: http://www.twistedmatrix.com/users/glyph/preexec.bash.txt
Сроки выполнения с помощью этот крюк (Mac OS X): Используйте Growl для отслеживания длинных команд оболочки
Поместит ли \ 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 >
Вы можете изменить формат печати как менее уродливый (на странице man tcsh).
/bin 4 > set time = ( 0 "last: %E" )
/bin 5 > sleep 10
last: 0:10.09
/bin 6 >
Я не знаю подобного объекта в bash
Используя ваши ответы и некоторые другие потоки, я написал это приглашение, которое хочу поделиться с вами. Я сделал снимок экрана, в котором вы можете увидеть:
Вот код, который нужно вставить в файл ~ / .bashrc:
function timer_now {
date +%s%N
}
function timer_start {
timer_start=${timer_start:-$(timer_now)}
}
function timer_stop {
local delta_us=$((($(timer_now) - $timer_start) / 1000))
local us=$((delta_us % 1000))
local ms=$(((delta_us / 1000) % 1000))
local s=$(((delta_us / 1000000) % 60))
local m=$(((delta_us / 60000000) % 60))
local h=$((delta_us / 3600000000))
# Goal: always show around 3 digits of accuracy
if ((h > 0)); then timer_show=${h}h${m}m
elif ((m > 0)); then timer_show=${m}m${s}s
elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s
elif ((s > 0)); then timer_show=${s}.$(printf %03d $ms)s
elif ((ms >= 100)); then timer_show=${ms}ms
elif ((ms > 0)); then timer_show=${ms}.$((us / 100))ms
else timer_show=${us}us
fi
unset timer_start
}
set_prompt () {
Last_Command=$? # Must come first!
Blue='\[\e[01;34m\]'
White='\[\e[01;37m\]'
Red='\[\e[01;31m\]'
Green='\[\e[01;32m\]'
Reset='\[\e[00m\]'
FancyX='\342\234\227'
Checkmark='\342\234\223'
# Add a bright white exit status for the last command
PS1="$White\$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
PS1+="$Green$Checkmark "
else
PS1+="$Red$FancyX "
fi
# Add the ellapsed time and current date
timer_stop
PS1+="($timer_show) \t "
# If root, just print the host in red. Otherwise, print the current user
# and host in green.
if [[ $EUID == 0 ]]; then
PS1+="$Red\\u$Green@\\h "
else
PS1+="$Green\\u@\\h "
fi
# Print the working directory and prompt marker in blue, and reset
# the text color to the default.
PS1+="$Blue\\w \\\$$Reset "
}
trap 'timer_start' DEBUG
PROMPT_COMMAND='set_prompt'
Если вы еще не установили какие-либо другие ответы перед тем, как начать свою долговременную работу, и вам просто нужно знать, как долго выполнялась работа, вы можете сделать простой
$ HISTTIMEFORMAT="%s " history 2
, и он ответит чем-то вроде
654 1278611022 gvn up
655 1278611714 HISTTIMEFORMAT="%s " history 2
, и тогда вы можете просто визуально вычесть две метки времени (кто-нибудь знает, как захватить вывод команды history builtin history?)
Я обнаружил, что trap ... DEBUG
запускался каждый раз, когда вызывался $PROMPT_COMMAND
, сброс таймера и, следовательно, всегда возвращал 0.
Однако я обнаружил, что history
записывает время, и я прослушивал (g4)
history
не регистрирует команду (например, повторяющиеся или проигнорированные команды), то вы можете получить ответ: HISTTIMEFORMAT='%s '
PROMPT_COMMAND="
START=\$(history 1 | cut -f5 -d' ');
NOW=\$(date +%s);
ELAPSED=\$[NOW-START];
$PROMPT_COMMAND"
PS1="\$ELAPSED $PS1"
время начала будет неправильным.
history
. Я взял ответ от Ville Laurikari и улучшил его с помощью команды time
, чтобы показать точность второй секунды:
function timer_now {
date +%s%N
}
function timer_start {
timer_start=${timer_start:-$(timer_now)}
}
function timer_stop {
local delta_us=$((($(timer_now) - $timer_start) / 1000))
local us=$((delta_us % 1000))
local ms=$(((delta_us / 1000) % 1000))
local s=$(((delta_us / 1000000) % 60))
local m=$(((delta_us / 60000000) % 60))
local h=$((delta_us / 3600000000))
# Goal: always show around 3 digits of accuracy
if ((h > 0)); then timer_show=${h}h${m}m
elif ((m > 0)); then timer_show=${m}m${s}s
elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s
elif ((s > 0)); then timer_show=${s}.$(printf %03d $ms)s
elif ((ms >= 100)); then timer_show=${ms}ms
elif ((ms > 0)); then timer_show=${ms}.$((us / 100))ms
else timer_show=${us}us
fi
unset timer_start
}
trap 'timer_start' DEBUG
PROMPT_COMMAND=timer_stop
PS1='[last: ${timer_show}][\w]$ '
Конечно, для этого требуется запуск процесса, поэтому он менее эффективен , но все же достаточно быстро, чтобы вы не заметили.
Это минимальный автономный код для достижения желаемого:
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]$ '
Еще один очень минимальный подход:
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» в «11days, 13: 46: 39». Сед в конце меняет «1days» на «1day» и отбрасывает пустые начальные значения, такие как «0days, 00:». Отрегулируйте вкус.