Posso gravar a saída do comando time difference em um arquivo?

5

Posso gravar a saída do comando time difference em um arquivo?

Por exemplo, tentei:

$ time foo.sh > bar.txt

Mas só dá a saída de foo.sh para bar.txt.

    
por sheldonk 09.05.2013 / 21:55

4 respostas

8

Em muitos shells, incluindo ksh , zsh e bash , time é uma palavra-chave e é usada para pipelines de tempo.

time foo | bar

Horário dos comandos foo e bar ( zsh mostrará o detalhamento). Ele relata isso no stderr da shell.

time foo.sh > bar.txt

Irá lhe informar o tempo necessário para abrir bar.txt e executar foo.sh .

Se você quiser redirecionar a saída de time , será necessário redirecionar stderr no contexto em que time é iniciado como:

{ time foo.sh; } 2> bar.txt

Isto:

2> bar.txt time foo.sh

funciona também, mas com ksh93 e bash , porque não está na primeira posição, time não é reconhecido como uma palavra-chave, então o comando time é usado em vez disso ( você provavelmente notará o formato de saída diferente e não fará pipelines de tempo).

Observe que ambos redirecionariam a saída de tempo e os erros de foo.sh para bar.txt . Se você quiser apenas a saída de tempo, precisará:

{ time foo.sh 2>&3 3>&-; } 3>&2 2> bar.txt

Observe que o POSIX não especifica se time se comporta como uma palavra-chave ou integrada (se é um tempo pipelines ou comandos únicos). Portanto, para ser portável (caso você queira usá-lo em um script sh que você deseja portável para sistemas diferentes do tipo Unix), você provavelmente deve escrevê-lo:

command time -p foo.sh 2> bar.txt

Note que você não pode programar funções, built-in ou pipelines ou redirecionar os erros foo.sh separadamente, a menos que você inicie um shell separado, como em:

command time -p sh -c 'f() { blah; }; f | cat'

Mas isso significa que o tempo também incluirá o tempo de inicialização desse extra sh .

    
por 09.05.2013 / 22:50
3

Nem todas as versões de tempo suportam os argumentos -o e --output.

Você vai querer executar o comando assim:

(time script.sh) 1> /dev/null 2> /tmp/logFile

Isso colocará a saída de script.sh em / dev / null e os resultados em / tmp / logFile.

Se você quiser que STDERR e STDOUT acessem o arquivo de log, você pode executá-lo assim:

(time script.sh) &> /tmp/logFile
    
por 09.05.2013 / 22:05
2

Para obter a saída de ls e a saída de time no arquivo:

(time ls) &> log

Para obter apenas a saída de time no arquivo:

(time ls) 2> log
    
por 09.05.2013 / 22:14
2

/usr/bin/time sai para stderr , então você precisará redirecionar isso.

/usr/bin/time foo.sh 2>bar.txt

Se você usa o bash ' time builtin, você precisa escrever de forma diferente:

(time ls) 2>bar.txt

Como alternativa, o GNU time suporta um argumento --output :

/usr/bin/time --output bar.txt foo.sh 
    
por 09.05.2013 / 22:01