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)
fonte
2012-08-08 16:29:09
Questa è una FAQ: http://mywiki.wooledge.org/BashFAQ/032 –