Redireciona a saída do comando time no unix para uma variável no bash?

12

Eu só quero capturar a saída de um comando de tempo, por exemplo:

X=$(time ls)

ou

$(time ls) | grep real

A função de hora a cospe para o console. Como faço isso?

    
por Joshua Enfield 27.08.2010 / 19:42

4 respostas

11

X='(time ls) 2>&1 | grep real'

    
por 27.08.2010 / 19:51
11

Veja BashFAQ / 032 .

$ # captures output of command and time
$ time=$( TIMEFORMAT="%R"; { time ls; } 2>&1 )    # note the curly braces

$ # captures the time only, passes stdout through
$ exec 3>&1 4>&2
$ time=$(TIMEFORMAT="%R"; { time ls 1>&3 2>&4; } 2>&1)
bar baz
$ exec 3>&- 4>&-

A hora será parecida com "0,000" usando TIMEFORMAT="%R" , que será a hora "real".

    
por 27.08.2010 / 20:53
4

O tempo grava sua saída para STDERR em vez de STDOUT. Para piorar, por padrão, 'tempo' é um comando embutido no shell, portanto, se você tentar 'tempo ls 2 > & 1', o '2 > 1' só se aplica a 'ls'.

A solução provavelmente seria algo como:

/usr/bin/time -f 'real %e' -o OUTPUT_FILE ls > /dev/null 2>&1<br>
REALTIME=$(cat OUTPUT_FILE | cut -f 2 -d ' ')

Existem maneiras mais extravagantes de fazê-lo, mas essa é a maneira clara / simples.

    
por 27.08.2010 / 20:03
0

A resposta do @Dennis Williamson é ótima, mas não ajuda a armazenar a saída do comando em uma variável e a saída de time em outra variável. Isso na verdade não é possível usando descritores de arquivos.

Se você quiser registrar quanto tempo um programa demora para ser executado, basta fazer isso subtraindo a hora de início da hora de término. Aqui está um exemplo simples que mostra quantos milissegundos um programa levou para ser executado:

START_TIME=$(date +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(date +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"

Isso não é tão preciso quanto o comando time , mas deve funcionar perfeitamente bem para a maioria dos scripts bash.

Infelizmente, o comando date do Mac não suporta o formato %N , mas você pode instalar coreutils ( brew install coreutils ) e usar gdate :

START_TIME=$(gdate +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(gdate +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
    
por 03.12.2018 / 15:06

Tags