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.

abubacker
fonte
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,
1
Possível duplicata de Existe uma maneira de redirecionar a saída de tempo para um arquivo no Linux
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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.

sganesh
fonte
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
ghostdog74
fonte
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.

Mnementh
fonte
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.

Michal Čihař
fonte
/ 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.

Ding-Yi Chen
fonte
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
user1338062
fonte
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
cognativo
fonte