Существует ли способ встроить прошедшее стенное время последней команды в подсказку Bash? Я надеюсь на что-то, что было бы похоже на это:
[last: 0s][/my/dir]$ sleep 10
[last: 10s][/my/dir]$
Фон
Я часто выполняю долгие уплотняющие данные задания, и полезно знать, сколько времени они взяли так, я могу оценить, сколько времени это возьмет для будущих заданий. Для очень регулярных задач я иду вперед и записываю эту информацию строго с помощью соответствующих методов входа. Для менее - формальные задачи, я буду просто предварительно ожидать команду с time
.
Было бы хорошо автоматически time
каждой интерактивной команде и распечатали информацию синхронизации в нескольких символах, а не 3 строках.
Другой подход для удара 4.x и выше должен был бы использовать coproc
с PS0
и PS1
как ниже:
cmd_timer()
{
echo $(( SECONDS - $(head -n1 <&"${CMD_TIMER[0]}") ))
}
coproc CMD_TIMER ( while read; do echo $SECONDS; done )
echo '' >&"${CMD_TIMER[1]}" # For value to be ready on first PS1 expansion
export PS0="\$(echo '' >&${CMD_TIMER[1]})"
export PS1="[ \$(cmd_timer) ] \$"
Это .bashrc
готовый отрывок. Это особенно полезно для всех, которые используют , не отвлекают - меня , который перезаписывает trap DEBUG
в его собственных целях.
Вот мое взятие на Thomas
использование date +%s%3N
для получения миллисекунд, как основная единица, упрощенная после кода (меньше нулей)
function t_now {
date +%s%3N
}
function t_start {
t_start=${t_start:-$(t_now)}
}
function t_stop {
local d_ms=$(($(t_now) - $t_start))
local d_s=$((d_ms / 1000))
local ms=$((d_ms % 1000))
local s=$((d_s % 60))
local m=$(((d_s / 60) % 60))
local h=$((d_s / 3600))
if ((h > 0)); then t_show=${h}h${m}m
elif ((m > 0)); then t_show=${m}m${s}s
elif ((s >= 10)); then t_show=${s}.$((ms / 100))s
elif ((s > 0)); then t_show=${s}.$((ms / 10))s
else t_show=${ms}ms
fi
unset t_start
}
set_prompt () {
t_stop
}
trap 't_start' DEBUG
PROMPT_COMMAND='set_prompt'
Тогда, добавляет $t_show
к PS1