Uma maneira de fazer isso seria usar o recurso PROMPT_COMMAND do bash para executar o código que modifica o PS1. A função abaixo é uma versão atualizada da minha submissão original; este usa duas variáveis de ambiente a menos e prefixa-as com "_PS1_" para tentar evitar a supressão de variáveis existentes.
prompt_command() {
_PS1_now=$(date +%s)
PS1=$( printf "\[\e[0;32m\]%02d:%02d:%02d \W>\[\e[1;37m\] " \
$(( ( _PS1_now - _PS1_lastcmd ) / 3600)) \
$(( (( _PS1_now - _PS1_lastcmd ) % 3600) / 60 )) \
$(( ( _PS1_now - _PS1_lastcmd ) % 60)) \
)
_PS1_lastcmd=$_PS1_now
}
PROMPT_COMMAND='prompt_command'
_PS1_lastcmd=$(date +%s)
Coloque isso no seu .bash_profile para iniciar as coisas.
Note que você precisa digitar rapidamente para obter o parâmetro sleep
para corresponder ao parâmetro prompt - a hora é realmente a diferença entre os prompts, incluindo o tempo que você leva para digitar o comando.
00:00:02 ~> sleep 5 ## here I typed really quickly
00:00:05 ~> sleep 3 ## here I took about 2 seconds to enter the command
00:00:10 ~> sleep 30 ## more slow typing
00:01:35 ~>
Adição tardia:
Com base na resposta agora excluída do @Cyrus, aqui está uma versão que não atravessa o ambiente com variáveis extras:
PROMPT_COMMAND='
_prompt(){
PROMPT_COMMAND="${PROMPT_COMMAND%-*}-$SECONDS))\""
printf -v PS1 "\[\e[0;32m\]%02d:%02d:%02d \W>\[\e[1;37m\] " \
"$(($1/3600))" "$((($1%3600)/60))" "$(($1%60))"
}; _prompt "$((SECONDS'"-$SECONDS))\""
Adição extra tardia:
Começando na versão bash 4.2 ( echo $BASH_VERSION
), você pode evitar as chamadas date
externas com uma nova string de formato printf; substitua as $(date +%s)
partes por $(printf '%(%s)T' -1)
. A partir da versão 4.3 , você pode omitir a% parâmetro-1
para confiar no comportamento "nenhum argumento significa agora ".