Como redirect a saída do comando time para um arquivo no Linux?

Apenas uma pequena pergunta sobre programas de temporização no Linux: o comando time permite medir o tempo de execução de um programa:

[ed@lbox200 ~]$ time sleep 1 real 0m1.004s user 0m0.000s sys 0m0.004s 

Que funciona bem. Mas se eu tentar redirect a saída para um arquivo, ele falhará.

 [ed@lbox200 ~]$ time sleep 1 > time.txt real 0m1.004s user 0m0.001s sys 0m0.004s [ed@lbox200 ~]$ cat time.txt [ed@lbox200 ~]$ 

Eu sei que existem outras implementações de tempo com a opção -o para gravar um arquivo, mas a minha pergunta é sobre o comando sem essas opções.

Alguma sugestão ?

Experimentar

 { time sleep 1 ; } 2> time.txt 

que combina o STDERR de “time” e seu comando em time.txt

Ou use

 { time sleep 1 2> sleep.stderr ; } 2> time.txt 

que coloca STDERR de “sleep” no arquivo “sleep.stderr” e somente STDERR de “time” entra em “time.txt”

Enrole o time e o comando que você está sincronizando em um conjunto de colchetes.

Por exemplo, os seguintes horários ls e escrevem o resultado de ls e os resultados do tempo para o outfile :

 $ (time ls) > outfile 2>&1 

Ou, se você quiser separar a saída do comando da saída capturada do time :

 $ (time ls) > ls_results 2> time_results 

Simples. O utilitário de time GNU tem uma opção para isso.

Mas você tem que garantir que você não está usando o comando de time embutido do seu shell, pelo menos o bash builtin não fornece essa opção! É por isso que você precisa fornecer o caminho completo do utilitário de time :

 /usr/bin/time -o time.txt sleep 1 

Se você se preocupa com a saída de erros do comando, pode separá-los desta forma enquanto ainda usa o comando de tempo integrado.

 { time your_command 2> command.err ; } 2> time.log 

ou

 { time your_command 2>1 ; } 2> time.log 

Como você vê os erros do comando vão para um arquivo (já que o stderr é usado para o time ).

Infelizmente você não pode enviá-lo para outro identificador (como 3>&2 ), uma vez que não existirá mais fora do {...}

Dito isso, se você puder usar o tempo GNU, faça o que @Tim Ludwinski disse.

 \time -o time.log command 

Se você estiver usando o tempo GNU em vez do bash embutido, tente

 time -o outfile command 

(Nota: os formatos de hora do GNU são um pouco diferentes do que o bash embutido).

Como a saída do comando ‘time’ é a saída de erro, redirecioná-la como saída padrão seria mais intuitivo para processar mais.

 { time sleep 1; } 2>&1 | cat > time.txt 
 &>out time command >/dev/null 

no seu caso

 &>out time sleep 1 >/dev/null 

então

 cat out 
 #!/bin/bash set -e _onexit() { [[ $TMPD ]] && rm -rf "$TMPD" } TMPD="$(mktemp -d)" trap _onexit EXIT _time_2() { "$@" 2>&3 } _time_1() { time _time_2 "$@" } _time() { declare time_label="$1" shift exec 3>&2 _time_1 "$@" 2>"$TMPD/timing.$time_label" echo "time[$time_label]" cat "$TMPD/timing.$time_label" } _time a _do_something _time b _do_another_thing _time c _finish_up 

Isto tem o benefício de não gerar sub shells, e o pipeline final tem stderr restaurado para o stderr real.

Acabei usando:

 /usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol 
  • Onde “a” é anexado
  • Onde “o” é processado pelo nome do arquivo para append
  • Onde “f” é o formato com uma syntax semelhante a printf
  • Onde “% E” produz 0:00:00; horas: minutos: segundos
  • Eu tive que invocar / usr / bin / time porque o bash “time” estava atropelando e não tem as mesmas opções
  • Eu estava apenas tentando obter saída para arquivo, não a mesma coisa como OP

Se você não quiser tocar no processo original ‘stdout e stderr, você pode redirect o stderr para o descritor de arquivo 3 e voltar:

 $ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out foo bar at -e line 1. $ cat time.out real 0m0.009s user 0m0.004s sys 0m0.000s 

Você poderia usar isso para um wrapper (por exemplo, para o cronjobs) para monitorar tempos de execução:

 #!/bin/bash echo "[$(date)]" "$@" >> /my/runtime.log { time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log 

Se você estiver usando csh você pode usar:

 /usr/bin/time --output=outfile -p $SHELL -c 'your command' 

Por exemplo:

 /usr/bin/time --output=outtime.txt -p csh -c 'cat file'