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

Существует ли способ встроить прошедшее стенное время последней команды в подсказку Bash? Я надеюсь на что-то, что было бы похоже на это:

[last: 0s][/my/dir]$ sleep 10
[last: 10s][/my/dir]$

Фон

Я часто выполняю долгие уплотняющие данные задания, и полезно знать, сколько времени они взяли так, я могу оценить, сколько времени это возьмет для будущих заданий. Для очень регулярных задач я иду вперед и записываю эту информацию строго с помощью соответствующих методов входа. Для менее - формальные задачи, я буду просто предварительно ожидать команду с time.

Было бы хорошо автоматически time каждой интерактивной команде и распечатали информацию синхронизации в нескольких символах, а не 3 строках.

60
задан 18 February 2013 в 23:55

2 ответа

Другой подход для удара 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 в его собственных целях.

1
ответ дан 1 November 2019 в 09:49

Вот мое взятие на 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

0
ответ дан 1 November 2019 в 09:49

Другие вопросы по тегам:

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