Voglio solo catturare l'output di un comando time cioè:
X=$(time ls)
o
$(time ls) | grep real
Tuttavia, la funzione time lo sputa sulla console. Come faccio a fare questo?
Voglio solo catturare l'output di un comando time cioè:
X=$(time ls)
o
$(time ls) | grep real
Tuttavia, la funzione time lo sputa sulla console. Come faccio a fare questo?
Risposte:
Vedi 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>&-
Il tempo apparirà come "0.000" usando TIMEFORMAT="%R"
quale sarà il tempo "reale".
exec
comando nella mia risposta utilizzando i descrittori di file disponibili. È possibile utilizzare qualsiasi descrittore di file disponibile. Gli stream 3 e 4 sono copie di 1 ( stdout
) e 2 ( stderr
), rispettivamente. Ciò consente all'output di ls
di passare normalmente a stdout
e stderr
tramite 3 e 4 mentre l'output di time
(che normalmente passa a stderr
) viene reindirizzato all'originale stdout
(1) e quindi acquisito nella variabile mediante la sostituzione del comando. Come puoi vedere nel mio esempio, i nomi dei file bar
e baz
vengono inviati al terminale. ...
-
.
Time scrive il proprio output su STDERR anziché su STDOUT. A peggiorare le cose, per impostazione predefinita 'time' è un comando incorporato della shell, quindi se si tenta di 'time ls 2> & 1' il '2> & 1' si applica solo a 'ls'.
La soluzione sarebbe probabilmente qualcosa del tipo:
/usr/bin/time -f 'real %e' -o OUTPUT_FILE ls > /dev/null 2>&1<br>
REALTIME=$(cat OUTPUT_FILE | cut -f 2 -d ' ')
Ci sono modi più fantasiosi per farlo, ma questo è il modo chiaro / semplice.
La risposta di @Dennis Williamson è ottima, ma non aiuta a memorizzare l'output del comando in una variabile e l'output di time
in un'altra variabile. Questo in realtà non è possibile utilizzando i descrittori di file.
Se si desidera registrare il tempo necessario per l'esecuzione di un programma, è possibile farlo sottraendo l'ora di inizio dall'ora di fine. Ecco un semplice esempio che mostra quanti millisecondi un programma ha impiegato per essere eseguito:
START_TIME=$(date +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(date +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
Questo non è accurato come il time
comando, ma dovrebbe funzionare perfettamente per la maggior parte degli script bash.
Sfortunatamente il date
comando di Mac non supporta il %N
formato, ma puoi installare coreutils
( brew install coreutils
) e usare gdate
:
START_TIME=$(gdate +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(gdate +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
time
; La risposta di Dennis Williamson è migliore al riguardo.