Senden Sie eine Kopie der Ausgabe eines Skripts an eine Datei

10

Angenommen, ich habe ein Zsh-Skript und möchte, dass es die Ausgabe druckt STDOUT, aber auch die Ausgabe in eine Datei auf der Festplatte kopiert (ausgibt).

Darüber hinaus beginnt das Skript mit der folgenden Option

set -o xtrace

Dies zwingt es, ausführlich zu sein und zu drucken, welche Befehle es ausführt. Ich möchte diese Ausgabe auch in einer Datei auf der Festplatte erfassen.

Mein Verständnis ist, dass wenn ich es tue

./my_script.sh > log.txt

es sendet nur STDOUTzu log.txt, aber was , wenn ich auch in der Lage sein will, die Ausgabe im Terminal zu sehen?

Ich habe über teeund die MULTIOSOption in Zsh gelesen, bin mir aber nicht sicher, wie ich sie verwenden soll.

Wenn ich es tue:

./my_script | tee log.txt

Ich kann die Ausgabe auf dem Terminal sehen, aber die Datei log.txtscheint nicht alles zu erfassen (tatsächlich erfasst sie kaum etwas).

Amelio Vazquez-Reina
quelle
./my_script.sh > log.txt 2>&1
Mikesserv
Sieht so aus, als würden Sie nach dem scriptBefehl suchen . Oder vielleichtmyscript >&1 > log.txt 2>&1
Stéphane Chazelas

Antworten:

12

Es kann sein, dass Ihr Skript eine Ausgabe an stdoutund erzeugt stderrund Sie nur einen dieser Streams in Ihre Protokolldatei ausgeben.

./my_script.sh | tee log.txtwird zwar alles an das Terminal ausgeben, aber nur stdoutin die Protokolldatei ausgeben .

./my_script.sh > log.txt 2>&1 wird das Gegenteil tun, indem alles in die Protokolldatei kopiert wird, aber nichts auf dem Bildschirm angezeigt wird.

Der Trick besteht darin, beide zu kombinieren mit tee:

./myscript.sh 2>&1 | tee log.txt

Dadurch wird stderr( 2) in stdout( 1) umgeleitet und dann stdoutin weitergeleitet tee, wodurch es in das Terminal und in die Protokolldatei kopiert wird .

Das zshMultios-Äquivalent wäre:

./myscript.sh >&1 > log.txt 2>&1

Das heißt, leiten Sie stdout sowohl zum ursprünglichen stdout als auch zur log.txt um (intern über eine Pipe zu etwas, das funktioniert tee), und leiten Sie dann stderr auch zu diesem Pipe um (zur Pipe zum internen teeProzess).

Savanto
quelle
Danke - In Bezug auf Ihre letzte Zeile, warum nicht ./myscript.sh >&1 2>&1 > log.txt? (dh die Reihenfolge der letzten beiden Umleitungen ändern). Würde es einen Unterschied zwischen ihnen geben?
Amelio Vazquez-Reina
Ihre Variante wird nicht ausgegeben stdout, nur auf log.txt. Die letzte Zeile in der Antwort (hinzugefügt von @ StéphaneChazelas und nicht von mir) wird an beide ausgegeben.
Savanto
0

Mit nohup kann ein Job auch dann fortgesetzt werden, wenn die Konsole stirbt oder geschlossen ist. Dies ist nützlich für lange Sicherungen usw., aber hier verwenden wir die automatische Protokollierung.

nohup myscript.sh & ; tail -f nohup.out
zzapper
quelle