2016-05-06 11 views
1

Ich habe folgendes einfaches Beispiel, von denen ich verstehe nicht, wie es mit dem Ausgang kommt:Bash Ausgang in Funktion nicht wie erwartet

#!/bin/bash 

function wtf() { 
    echo -e "test1" >&1 
    sleep 2 
    echo -e "test2" >&1 
} 

a=$(wtf) 
echo $a 

Die Ausgabe auf dem Terminal ist nach 2 Sekunden test1 test2

Wenn ich die letzten beiden Zeilen nur zu wtf ändern, dann ist der Ausgang

test1 
test2 #after 2 seconds 
  1. Wh y ist in der ersten Version der test1 test2 in der gleichen Zeile?
  2. Warum benötigt der Ausgang der Zeile test1 test2 2 Sekunden, um anzuzeigen, nur die zweite test2 sollte nach 2 Sekunden angezeigt werden?

Antwort

1

Die $(...) erfasst die stdout der Befehle innerhalb der Subshell. Die echo -e Anweisungen werden nicht auf die stdout der aufrufenden Shell, gedruckt, sondern in der Subshell gepuffert. Wenn Sie den Befehl echo $a entfernen, wird nichts gedruckt.

Die Subshell in diesem Beispiel wird erst beendet, wenn wtf abgeschlossen ist. Aus diesem Grund müssen Sie 2 Sekunden warten, damit die aufrufende Shell die Kontrolle zurückerhält und echo $a druckt, wobei alle Ausgaben gedruckt werden, die von der Subshell erfasst wurden.

+0

Thx für die Klärung, gibt es eine Möglichkeit, auf die stdout sowieso in der Funktion zu drucken? – wasp256

+0

'stdout' wird von der Subshell erfasst, also nein, das geht nicht. Sie könnten jedoch mit 'echo test3> & 2' auf' stderr' drucken. – janos

+0

Das hat funktioniert – wasp256

Verwandte Themen