Um comando antes de cada comando bash

18

Alguém sabe como colocar um comando 'time' antes de cada comando em uma sessão do bash?

jthoenes
fonte
11
então ... você deseja anexar automaticamente 'tempo' a cada linha de comando?
quack quixote
11
sim, excaptly ... para mesuarament desempenho obviamente
jthoenes
Veja também: superusuário.com
questions

Respostas:

37

Desculpe pela resposta errada antes, não entendi sua pergunta.

Para ter o tempo adicionado antes de cada comando que você executa no shell, você pode fazer algo como isto

bind 'RETURN: "\e[1~time \e[4~\n"'

Isso religará a chave de retorno. Agora, toda vez que você pressionar return, em vez de escrever uma nova linha \ n, ela irá para o início da linha, digite o texto 'time' e um espaço, vá para o final da linha e digite a nova linha \ n, produzindo assim a desejada efeito.

Se você não quiser sacrificar sua tecla Enter, poderá criar uma segunda chave de referência como F12, vinculando o comando como este

bind '"\e[24~": "\e[1~time \e[4~\n"'

Agora, em vez de substituir a chave de retorno, você vincula F12.

O pano de fundo de tudo isso é que o bash usa a GNU readline para ler comandos. Portanto, o readline seria um bom ponto de partida para mais manipulação de comandos, etc.

Lukas Loesche
fonte
11
+1 boa solução! Eu gosto da idéia de ter uma tecla enter de benchmarking separada da tecla enter normal.
quack quixote
essa é uma ideia inteligente. Como você pode generalizá-lo para executar uma função definida pelo usuário antes de cada comando? Não sei como combinar o código bash e uma função readline na mesma ligação.
Gilles 'SO- stop be evil'
Isso não será executado no Mac? Executei o comando no terminal e minha tecla enter parece não fazer nada agora.
akki 16/09/19
6

Sei que isso está fora do escopo desta pergunta, mas ...

Em zsh(que, é do meu conhecimento, um super conjunto de bash) se você definir a seguinte variável em seu .zshrcarquivo:

export REPORTTIME=5

Todo comando que leva mais de 5 segundos (tenho certeza) exibirá a saída de time. Todos os comandos que são concluídos mais rapidamente não são. E nesses casos, realmente não se importa, por isso é bom não bagunçar as coisas. Também existem muitos outros recursos interessantes zshque você pode aproveitar enquanto está nisso.

tychoish
fonte
Boa dica. Embora o zsh certamente tenha um superconjunto da funcionalidade do bash , sua sintaxe não é um superconjunto da sintaxe do bash , portanto, não é uma substituição do tipo "drop in".
quer
1

Inclua \ t na sua string de prompt. Isso incluirá o horário no seu prompt no ponto em que você o incluir. Consulte: http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

JRobert
fonte
Esse é o horário atual no momento em que o prompt é gerado, não o tempo que levou para executar o comando anterior.
Pausado até novo aviso.
Verdade; e a diferença entre esse e o horário atual do próximo prompt é o tempo de execução (menos o tempo de digitação, é claro - colar aqui é seu amigo). Não são necessárias redesignações importantes.
JRobert # 8/10
0

PS1 parece ser a maneira padrão de fazer algo assim.

Jason Sundram
fonte
2
Ele modifica a exibição, não o comando executado real.
user1686
@ Grarawity Certo - mas você obteria exatamente o que deseja ... o tempo precedido para cada linha.
Jason Sundram
3
O que é completamente diferente do que timefaz (mede quanto tempo levou para que um comando fosse executado).
user1686
@ Grarawity, acho que você está certo - você teria que fazer a subtração sozinho. Parece que @Jrobert teve a mesma idéia.
Jason Sundram