É possível adicionar à força um alias de tempo (por falta de uma maneira melhor de expressá-lo) a cada comando bash
?
Por exemplo, eu gostaria de ter um usuário específico que, sempre que um comando é executado, ele sempre é agrupado com date
antes e depois ou time
.
Isso é possível e, em caso afirmativo, como?
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.preexec()
função para realmente encapsular o que estava executando, buscando o comando, executando-o de dentro da função e retornando algum tipo de erro para que o shell não execute o próprio comando.Respostas:
Você pode registrar a hora em que uma linha de comando é iniciada e a hora em que um prompt é exibido. O Bash já acompanha a data de início de cada linha de comando em seu histórico e você pode observar a hora em que exibe o próximo prompt.
Isso fornece apenas uma segunda resolução e apenas o tempo do relógio de parede. Se você quiser uma melhor resolução, precisará usar um
date
comando externo que suporte o%N
formato para nanossegundos e oDEBUG
trap para chamardate
antes de executar o comando no tempo.Mesmo com a
DEBUG
armadilha, não acho que exista uma maneira de exibir automaticamente os tempos do processador para cada comando ou de ser mais discriminador do que o prompt a prompt.Se você estiver disposto a usar um shell diferente, veja como obter um relatório de horário para cada comando no zsh (isso não generaliza para outras tarefas):
Você pode definir
REPORTTIME
qualquer valor inteiro; as informações de tempo serão exibidas apenas para comandos que usaram mais do que muitos segundos de tempo do processador.O Zsh pegou esse recurso do csh, onde a variável é chamada
time
.fonte
Suas opções aqui vão depender do seu shell. Em
zsh
há uma função de gancho conveniente chamadapreexec()
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 chamadaprecmd()
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 comandoprecmd()
e o produziremos antes do prompt ou o registraremos. Exemplo: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.
Em uma implementação mais prática
preexec()
, eu uso para ver se o shell está sendo executado dentrotmux
ouscreen
, 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.
fonte
A maneira mais fácil provavelmente seria definir
PROMPT_COMMAND
. Consulte Variáveis Bash :Por exemplo, para evitar a substituição de qualquer comando de prompt existente, você pode:
fonte
csh
/tcsh
tem o melhor suporte para esse recurso (e sempre o teve).Em outras palavras,
set time=1
imprimirá o tempo consumido (sistema, usuário, decorrido) por qualquer comando que demorou mais de 1 segundo do tempo da CPU. Plainset time
permitirá a impressão do tempo para todos os comandos.fonte