Como relatar tempo e outras informações sobre todos os comandos bash? [duplicado]

5

A maioria das coisas que eu executo no terminal levam muito tempo para computar e eu gostaria de ter uma saída bash com um relatório de tempo no final de cada comando inserido no terminal. Existe algo que eu possa colocar no meu bashrc para fazer isso?

Exemplo:

$ find / -ls
<find / -ls return info>
start time = 10:21:54 | end time = 10:31:34 | time lapsed = 00:10:20
$

ou

$ make all
<make all return info>
start time = 10:21:54 | end time = 10:31:34 | time lapsed = 00:10:20

Seria bom poder adicionar uma lista de exceções para comandos como cd, mas isso não me incomodaria muito.

    
por OhmArchitect 19.11.2013 / 18:38

2 respostas

3

Eu tentei o seguinte no meu .bashrc :

echo -ne "$PS1"
while IFS= read -er line;do
    eval "time $line"
    echo -ne "$PS1"
done

Isso faz aproximadamente o que você quer com várias ressalvas:

  • Seu prompt está praticamente arruinado (o shell geralmente interpreta sequências como \W e assim por diante no seu prompt antes de ecoá-lo).
  • Você perde os recursos de edição de linha de comando (por exemplo, você não pode usar CTRL + L para clear ).
  • Provavelmente vários outros.

Acho que um bom compromisso seria ativá-lo seletivamente por meio de uma função de shell:

timed_commands() {
    [ "$1" = off ] && exec bash
    PS1='$ '  # Put something simple here
    while IFS= read -erp "$PS1" line;do
        eval "time $line"
    done
}

Ativá-lo com timed_commands e desativá-lo com timed_commands off

Obrigado ao comentário do @jthill sobre a -e mudar para read .

    
por 19.11.2013 / 19:25
1

agora isso é hackiano como todo o inferno, mas pode funcionar ...

defina a string id do terminal (a string retornada por inquire) para "time". observe o espaço à direita. Em seguida, defina seu prompt para terminar com uma consulta. Agora, toda vez que seu prompt é exibido, o terminal automaticamente digita o tempo e um espaço para você, quando você digita seu comando. isso não funcionará com todos os terminais porque muitos desativaram essa funcionalidade para evitar que isso aconteça.

Para fazer isso funcionar com o xterm, adicione a seguinte linha ao seu .Xresources e recarregue-o com xrdb

xterm*answerbackString: time ^[0D^[0A
URxvt*answerbackString: time ^[0D^[0A
xterm_color*answerbackString: time ^[0D^[0A

em que ^ [é um escape (porque o xterm não gosta de espaço no final do responsebackString, eu movo o cursor.

em seguida, adicione o ENQ ao final da sua string de prompt (exemplo específico do bash):

PS1="${PS1}\[
xterm*answerbackString: time ^[0D^[0A
URxvt*answerbackString: time ^[0D^[0A
xterm_color*answerbackString: time ^[0D^[0A
5\]"

inicie um novo shell em um novo xterm e cruze seus dedos, ele deve funcionar. o \ 005 é um ENQ o [e] diz ao bash que o \ 005 não move o cursor.

    
por 19.11.2013 / 21:02