Suas opções aqui vão depender do seu shell. Em zsh
há uma função de gancho conveniente chamada preexec()
que é executado logo antes de quaisquer comandos shell interativo. Ao criar uma função com esse nome, você pode fazer com que as coisas sejam executadas. Você também pode acompanhar uma função chamada precmd()
que será executada pouco antes do próximo prompt ser desenhado, que será logo após a conclusão do comando.
Ao criar esse par de funções, você pode ter os comandos arbitrários que deseja executar antes e depois dos comandos emitidos no prompt. Você pode usar isso para registrar o uso do shell, criar bloqueios, testar o ambiente ou, como no seu exemplo, calcular o tempo ou os recursos gastos enquanto um comando é executado.
Neste exemplo, criaremos um carimbo de data / hora de referência antes de executar um comando preexec()
, calcularemos o tempo gasto na execução do comando precmd()
e o produziremos antes do prompt ou o registraremos. Exemplo:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
Nota: Para este exemplo específico, há uma função interna ainda mais fácil. Tudo o que você precisa fazer é ativar os relatórios de tempo de execução no ZSH e isso será feito automaticamente.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
Em uma implementação mais prática preexec()
, eu uso para ver se o shell está sendo executado dentro tmux
ou screen
, se for o caso, para enviar informações sobre o comando atualmente em execução upstream para serem exibidas no nome da guia.
Infelizmente, no bash, esse pequeno mecanismo não existe. Aqui está a tentativa de um homem de replicá-lo . Veja também a resposta de Gilles para um hack pequeno e bacana.
preexec
, mas não deseja executá-lo dentro dopreexec
(por exemplopreexec() { time $1; }
), porque o shell ainda o executa após opreexec
retorno. Portanto, o melhor que podemos fazer é algo semelhante.