2012-08-08 17 views
7

sto cercando questo:Catturare l'output di tempo bash in variabile di script

TIMEFORMAT=%R; 
foo=$(time wget http://www.mysite.com) 
echo $foo 

e quando eseguo vedo il numero che voglio in uscita, ma non in variabile pippo (echo $ nulla di stampa foo) .

Perché è quello?

+1

Questa è una FAQ: http://mywiki.wooledge.org/BashFAQ/032 –

risposta

10

Non si acquisisce nulla in foo perché time invia l'output su stderr. Il problema è che il comando wget invia anche la maggior parte del suo output su stderr. Per dividere i due flussi (e buttare via l'uscita dal wget) sarà necessario utilizzare un subshell: La parte interna di questo comando

TIMEFORMAT=%R; 
foo=$(time (wget http://www.example.com 2>/dev/null 1>&2) 2>&1) 
echo $foo 

Ecco una spiegazione di quello che sta succedendo ...

:

(wget http://www.example.com 2>/dev/null 1>&2) 

invia sia stderr e stdout a /dev/null, essenzialmente gettarli via.

La parte esterna:

foo=$(time (...) 2>&1) 

mandate stderr dal comando time nello stesso luogo che stdout viene inviato in modo che possa essere catturata dal command substitution ($()).

Aggiornamento:

Se si voleva ottenere molto intelligente, si può avere l'output di wget attraversato a stderr da giocoleria i descrittori di file come questo:

foo=$(time (wget http://www.example.com 2>&1) 3>&1 1>&2 2>&3) 
+0

Tu, @ lee-netherton, sei un salvatore! – iGbanam

Problemi correlati