Como executar o tempo em vários comandos E gravar a saída de tempo para o arquivo?

60

Eu quero executar o comando time para medir o tempo de vários comandos.

O que eu quero fazer é:

  • Meça o tempo de execução de todos eles adicionados juntos
  • Grave a saída time em um arquivo
  • Escreva o STDERR do comando que estou medindo para STDERR

O que eu faço NÃO quer fazer é

  • Escreva os vários comandos em um script separado (por quê? Porque tudo isso já é um script que estou gerando programaticamente, e criar OUTRO script temporário seria mais bagunça do que eu quero)

O que eu tentei até agora:

/usr/bin/time --output=outtime -p echo "a"; echo "b";

Não funciona, time é executado apenas no primeiro.

/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )

Não funciona, ( é token inesperado.

/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }

Não funciona, "nenhum arquivo ou diretório desse tipo".

/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'

Não funciona, "nenhum arquivo ou diretório desse tipo".

time ( echo "a"; echo "b"; ) 2>outtime

Não funciona, pois redireciona todos os STDERR para outtime ; Eu quero apenas a saída time lá.

E, claro,

time --output=outime echo "a";

Não funciona, pois --output=outime: command not found .

Como posso fazer isso?

    
por Karel Bílek 22.08.2012 / 06:14

3 respostas

78

Use sh -c 'commands' como o comando, por exemplo:

/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
    
por 22.08.2012 / 21:36
6

Tente isto:

% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput                                
( { echas z; echo 2; } 2>&3; )  0.00s user 0.00s system 0% cpu 0.004 total

Explicação:

Primeiro, precisamos encontrar uma maneira de redirecionar a saída de time . Como time é um shell embutido, ele usa a linha de comando completa como o comando a ser medido, incluindo redirecionamentos. Assim,

% time whatever 2>timeoutput
whatever 2> timeoutput  0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput 
zsh: command not found: whatever

[Nota: o comentário de janos implica que este não é o caso de bash .] Podemos alcançar o redirecionamento da saída de time executando time em uma sub-rede e redirecionando a saída dessa sub-camada. / p>

% (time whatever) 2> timeoutput
% cat timeoutput 
zsh: command not found: whatever
whatever  0.00s user 0.00s system 0% cpu 0.018 total

Agora, redirecionamos com sucesso a saída de time , mas sua saída é misturada com a saída de erro do comando que estamos medindo. Para separar os dois, usamos um descritor de arquivo adicional.

No lado de fora, temos

% (time ... ) 3>&2 2>timeout

Isto significa: o que estiver escrito no descritor de arquivo 3, será enviado para o mesmo lugar que o descritor de arquivo 2 (erro padrão) está emitindo agora (o terminal). E então redirecionamos o erro padrão para o arquivo timeout .

Então agora temos: tudo escrito para stdout e fd 3 irá para o terminal, e tudo escrito para stderr irá para o arquivo. O que resta é redirecionar o stderr do comando medido para fd3.

% (time whatever 2>&3) 3>&2 2>timeout

Agora, para fazer com que o tempo meça mais de um comando, precisamos executá-los em um (outro!) subshell (entre parênteses). E para redirecionar a saída de erro de todos eles para o fd 3, precisamos agrupá-los dentro de chaves.

Então, finalmente, chegamos a:

% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput

É isso.

    
por 22.08.2012 / 08:26
4

Não é a resposta correta, mas muito relacionada à pergunta.
Obter estatísticas de temporização para vários programas Parênteses combinados são obrigatórios. Separe os comandos com ponto e vírgula.

time ( command1 ; command2 )
    
por 31.08.2018 / 09:42