X='(time ls) 2>&1 | grep real'
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?
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".
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.
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"