Eu quero executar o time
comando para medir o tempo de vários comandos.
O que eu quero fazer é:
- Meça o tempo de execução de todos eles somados
- Grava a
time
saída em um arquivo - Escreva o
STDERR
comando que estou medindo paraSTDERR
O que eu NÃO quero fazer é
- Escreva os vários comandos em um script separado (por quê? Porque tudo isso já é um script que eu estou gerando programaticamente, e criar OUTRO script temporário seria mais bagunçado 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, (
é um token inesperado.
/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }
Não funciona, "não existe esse arquivo ou diretório".
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
Não funciona, "não existe esse arquivo ou diretório".
time ( echo "a"; echo "b"; ) 2>outtime
Não funciona, pois redireciona tudo STDERR
para outtime
; Eu quero apenas a time
saída lá.
E claro,
time --output=outime echo "a";
Não funciona desde então --output=outime: command not found
.
Como eu posso fazer isso?
fonte
time -p sh -c 'echo "a"; echo "b"'
Tente o seguinte:
Explicação:
Primeiro, temos que encontrar uma maneira de redirecionar a saída de
time
. Comotime
é um shell embutido, leva a linha de comando completa como o comando a ser medido, incluindo redirecionamentos. Portanto,[Nota: o comentário de janos implica que este não é o caso
bash
.] Podemos conseguir o redirecionamento datime
saída de s executandotime
em um subshell e, em seguida, redirecionando a saída desse subshell.Agora redirecionamos com êxito 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.Do lado de fora, temos
Isso significa: o que quer que seja gravado no descritor de arquivo 3, será gerado no mesmo local que o descritor de arquivo 2 (erro padrão) está sendo exibido agora (o terminal). E então redirecionamos o erro padrão para o arquivo
timeout
.Então agora temos: tudo escrito em stdout e em fd 3 irá para o terminal, e tudo escrito em stderr irá para o arquivo. O que resta é redirecionar o stderr do comando medido para fd 3.
Agora, para fazer o tempo medir mais de um comando, precisamos executá-los em um subshell (outro!) (Entre parênteses). E para redirecionar a saída de erro de todos eles para o fd 3, precisamos agrupá-los entre colchetes.
Então, finalmente, chegamos a:
É isso aí.
fonte
Não é a resposta correta, mas muito relacionada à pergunta.
Obtenha estatísticas de tempo para vários programas entre parênteses. Separe os comandos com ponto e vírgula.
fonte
time ( command1 && command2 )
para que, se o primeiro comando falhar; não continuará executando o outro.