Como posso redirecionar a saída do comando “time”?


95

Tentei redirecionar a saída do comando time, mas não consegui:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

No arquivo, posso ver a saída do lscomando, não a de time. Explique por que não pude e como fazer isso.


1
Deveria estar no Superuser, eu acho.
Mnementh

1
A resposta a esta pergunta não é apenas de interesse para programadores, mas também para outros usuários avançados: superuser.com
Mnementh,

Respostas:


104

você pode redirecionar a saída de tempo usando,

(time ls) &> file

Porque você precisa tomar (tempo ls) como um único comando para poder usar colchetes.


1
sim, relly bem, mas a questão é como eles fizeram isso?
abubacker,

2
O comando time tomará os argumentos como um comando. Mas os parênteses irão agrupar isso como um comando. Ex: tempo ls> arquivo1.txt Em argumentos, 0 = tempo 1 = "ls> arquivo1.txt"
sganesh

8
E o comando time imprime a saída em stderr. Portanto, você pode usar (tempo ls) 2> arquivo
sganesh

5
Esclarecimento sobre o &>favor, onde posso saber mais sobre isso?
hello_there_andy

3
@hello_there_andy &>fileé análogo a >file 2>&1. Ele direciona stdout e stderr.
ktbiz de

129

não há necessidade de iniciar o sub shell. Use um bloco de código também.

{ time ls; } 2> out.txt

ou

{ time ls > /dev/null 2>&1 ; } 2> out.txt

1
Concordo, melhor resposta. Dá a você a opção de descartar os resultados do LS e apenas obter o tempo. Obrigado ghostdog74
rd42

1
Isso funcionava com o AIX quando nada poderia redirecionar a saída do comando "hostent". Obrigado!
Hugo

1
Esclarecimento sobre o 2>favor. Onde posso aprender sobre isso?
hello_there_andy

3
como faço isso se quero> e 2> ao mesmo tempo?
Jorge Fernández

25

O tempo de comando envia sua saída para STDERR (em vez de STDOUT). Isso ocorre porque o comando executado com o tempo normalmente (neste caso ls) tem saída para STDOUT.

Se você deseja capturar a saída do tempo, digite:

(time ls) 2> filename

Isso captura apenas a saída de tempo, mas a saída de ls é normal para o console. Se você deseja capturar ambos em um arquivo, digite:

(time ls) &> filename

2> redireciona STDERR, &> redireciona ambos.


1
Essa resposta realmente responde por que o redirecionamento do OP não estava funcionando, uma das perguntas que o OP estava fazendo. Ninguém mais aborda isso.
NeutronStar 01 de

como seria um pipe para outro processo com isso?
Paul

10

o tempo está embutido no shell e não tenho certeza se há uma maneira de redirecioná-lo. No entanto, você pode usar em /usr/bin/timevez disso, o que definitivamente aceita qualquer redirecionamento de saída.


/ usr / bin / time - nome do arquivo de saída ls
chub

4
O tempo embutido funciona bem com redirecionamento de saída. Ele produz apenas em STDERR, não em STDOUT.
Mnementh

O problema é que os comandos embutidos são executados dentro do próprio ambiente de shell, não em um subshell. Como o stderr do seu shell está normalmente conectado ao terminal, o redirecionamento não fará nada. Para redirecionar o tempo embutido, acredito que você teria que fazer algo como bash time mycmd 2>file. Ou apenas ligue /usr/bin/timecomo foi mencionado.
ktbiz de

Você também pode usar o não integrado sem especificar o caminho completo: stackoverflow.com/questions/29540540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

4

Se você não quiser misturar a saída de timee o comando. Com o GNU time, você pode usar -o filecomo:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

while timé a saída do tempo, oute errsão stdout e stderr de grep.


4

O motivo pelo qual o redirecionamento parece não funcionar timeé que ele é uma palavra reservada do bash (não um embutido!) Quando usado na frente de um pipeline. bash (1):

Se a palavra reservada de tempo preceder um pipeline, o tempo decorrido, bem como o tempo do usuário e do sistema consumido por sua execução são relatados quando o pipeline termina.

Portanto, para redirecionar a saída de time, use chaves:

{ time ls; } 2> filename

Ou ligue para /usr/bin/time:

/usr/bin/time ls 2> filename

0

Eu uso o redirecionamento do método stdout e stderr com chaves para teste.
O &>>rptrepresenta isso, >>rpt 2>&1mas mais curto.
As chaves irão executar um comando (s) no shell atual. Veja: man bash

{ time ls a*; } &>>rpt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.