Wie kopiere ich mit bash stderr und stdout in eine Protokolldatei und lasse sie auch auf der Konsole angezeigt?
Ich möchte dies innerhalb des Skripts selbst mit einem exec tun.
Ich habe es mit versucht
exec &>> log.out
echo "This is stdout"
echo "This is stderr" >&2
Aber das obige druckt nichts auf der Konsole. Wie kann ich dies in Bash erreichen?
Antworten:
Sie suchen
tee
.Siehe
man tee
für Details.Um es mit zu kombinieren
exec
, müssen Sie die Prozessersetzung verwenden . (Sieheman bash
für Details.)quelle
exec 2>&1 | tee -a log.out
nur Drucke auf der Konsole ausgeführt, nichts in der Protokolldatei. Vielleicht verwende ich nicht die richtige Syntax?tee
in Kombination mit Prozesssubstitution darüber geschrieben .the-script | wc -l
zum Beispiel jemand tut , zählt dies auch die Fehlerzeilen und Sie werden die Fehler nicht sehen.Du kannst tun:
Sie könnten es auch schreiben als:
Da bash jedoch nicht auf die Prozesse wartet, mit denen begonnen
>(...
wurde, hat dies den unangenehmen Effekt, dass manchmal etwas an das Terminal ausgegeben wird, nachdem der Befehl zurückgegeben wurde, was noch schlimmere Auswirkungen haben kann (z. B. das stille Verwerfen dieser Ausgabe), wenn das Terminal-Attribut "tostop" ist an.stdout
Wenn Sie in beiden Lösungen eine Pipe erstellen und zwei Befehle unabhängig voneinander die Ausgabe- und Fehlermeldungen ausgeben, wirkt sich dies in jedem Fall auf die Ausgabepufferung und die Reihenfolge aus, in der die Ausgabe- und Fehlermeldungen angezeigt werden.quelle
tee -a log >&2 3>&-
Ich weiß, dass dies ein alter Beitrag ist, aber warum nicht einfach das tun?
Und wenn Sie Standard haben möchten, können Sie natürlich auch regelmäßig drucken.
Sie können dies mit einer beliebigen Kombination von Streams tun, indem Sie nur diese beiden grundlegenden Befehle verwenden.
Ich weiß, dass ich hierher gekommen bin und keine leicht verständliche Antwort erhalten habe. Hoffentlich hilft dies jemand anderem, der Probleme hat.
Übrigens, für Noobs da draußen wie mein vorheriges Ich gibt der
tee
Befehl lediglich die stdin-Eingabe sowohl an stdout als auch an die als nachfolgende Argumente angegebenen Dateien aus.-a
steht für append, damit Sie die Datei nicht bei jeder Verwendung des Befehls überschreiben. Wenn Sie weitere Fragen haben, ist dies eine sehr hilfreiche Ressource, um schnell Bash zu lernen.quelle
Eine weitere Möglichkeit besteht darin, Umleitungen innerhalb von Funktionen zu verwenden.
Hier haben wir eine
main
Funktion, die alle anderen Funktionen aufruft. Jetzt umleitenSTDOUT
undSTDERR
vonmain
Funktion zutee
.quelle