2012-08-08 5 views
7

ich dies bin versucht:Capturing die Ausgabe von bash Zeit in Skriptvariable

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

und wenn ich ausführen ich die Nummer sehe ich in der Ausgabe will, aber nicht in den Variablen foo (echo $ foo Druck nichts) .

Warum ist das?

+1

Dies ist eine FAQ ist: http://mywiki.wooledge.org/BashFAQ/032 –

Antwort

10

Sie erfassen nichts in foo, weil time seine Ausgabe auf stderr sendet. Das Problem ist, dass der Befehl wget auch den größten Teil seiner Ausgabe an stderr sendet. So teilen die beiden Ströme (und die Ausgabe von wget wegzuwerfen) müssen Sie verwenden, um eine subshell:

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

Hier ist eine Erklärung dessen, was los ist ...

Der innere Teil dieses Befehls :

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

Sendet sowohl stderr und stdout-/dev/null, im wesentlichen wegzuwerfen.

Der äußere Teil:

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

Sendet stderr vom time Befehl an der gleichen Stelle, die stdout gesendet wird, so dass es durch die command substitution ($()) eingefangen werden können.

Update:

Wenn Sie wirklich klug bekommen wollten, können Sie die Ausgabe von wget bis hin zu stderr durch Jonglieren die Datei-Deskriptoren wie diese geführt haben:

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

Sie, @ Lee-Netherton, sind ein Retter! – iGbanam