Use sh -c 'commands'
como o comando, por exemplo:
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
Eu quero executar o comando time
para medir o tempo de vários comandos.
O que eu quero fazer é:
time
em um arquivo STDERR
do comando que estou medindo para STDERR
O que eu faço NÃO quer fazer é
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?
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
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.
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 )
Tags shell command time-utility