Ich habe ein Bash-Skript mit viel Ausgabe und möchte dieses Skript ändern (kein neues erstellen), um die gesamte Ausgabe in eine Datei zu kopieren, so wie es passieren würde, wenn ich sie durch tee leiten würde.
Ich habe eine Datei script.sh :
#!/bin/bash
init
do_something_that_outputs_stuff_to_STDOUT
launch_applications_that_output_to_STDOUT
fini
und ich möchte eine Kopie von STDOUT in einer Datei script.log erstellen, ohne ./script.sh | tee script.log
jedes Mal eingeben zu müssen .
Danke, Tom
Antworten:
Ich konnte Dennis 'sehr einfachen Einzeiler nicht zum Laufen bringen, daher hier eine weitaus kompliziertere Methode. Ich würde sein erstes versuchen.
Wie bereits erwähnt, können Sie exec verwenden, um Standardfehler und Standardausgabe für das gesamte Skript umzuleiten. So:
exec > $LOGFILE 2>&1
Dies gibt alle stderr und stdout in $ LOGFILE aus.Da dies nun in der Konsole sowie in einer Protokolldatei angezeigt werden soll, müssen Sie auch eine Named Pipe verwenden, in die Exec schreiben und von der Tee lesen kann.
(Dennis 'Einzeiler macht dies auch technisch, wenn auch offensichtlich auf andere Weise). Die Pfeife selbst wird mit erzeugt
mkfifo $PIPEFILE
. Dann machen Sie folgendes.Wenn Sie gründlich sein möchten, können Sie die Named-Pipe-Datei am Anfang und Ende Ihres Skripts erstellen und löschen.
Fürs Protokoll habe ich das meiste davon aus dem sehr informativen Blog-Post eines zufälligen Mannes entnommen: ( Archivierte Version )
quelle
Fügen Sie dies einfach am Anfang Ihres Skripts ein:
Dadurch werden alle an stdout gesendeten Ausgaben an die Datei angehängt
script.log
und der vorherige Inhalt bleibt erhalten . Wenn Sie jedes Mal neu starten möchten, wenn das Skript ausgeführt wird, fügen Sie esrm script.log
direkt vor diesemexec
Befehl hinzu oder entfernen Sie das Symbol-a
aus demtee
Befehl.Die
-i
Option bewirkttee
, dass Interruptsignale ignoriert werden und möglicherweisetee
ein vollständigerer Ausgabesatz abgefangen wird.Fügen Sie diese Zeile hinzu, um auch alle Fehler abzufangen (in einer separaten Datei):
Die Leerzeichen zwischen den mehreren
>
Symbolen sind wichtig.quelle
Dies ist eine kombinierte Version der Antwort, die Dennis Williamson zuvor gepostet hat. Fügt err & std in der richtigen Reihenfolge an script.log an.
Fügen Sie diese Zeile an den Anfang Ihres Skripts ein:
Beachten Sie den Abstand zwischen den
>
Zeichen. Funktioniert für mich mit GNU bash, Version 3.2.25 (1) -release (x86_64-redhat-linux-gnu)quelle
Ich nehme an, ein anderer Ansatz ist ungefähr so:
quelle
Wenn Sie eine Kopie der Ausgabe wünschen, können Sie
tee
dies folgendermaßen tun:Dies wird jedoch nur stdout in script.log protokollieren. Wenn Sie sicherstellen möchten, dass sowohl stderr als auch stdout umgeleitet werden, verwenden Sie:
Du könntest es sogar ein bisschen schöner machen mit einer kleinen Funktion:
quelle
2>&1
und es zum Tee leiten.Das würdest du einfach benutzen:
Dies gibt alles in dieses Protokoll aus, alles und zeigt es auf dem Bildschirm an. Wenn Sie die Ausgabe FULL wünschen, gehen Sie wie folgt vor.
Und wenn Sie faul sind, können Sie das Skript erneut abspielen.
quelle
script
es sich um ein Paket handelt, z.sudo apt-get install script
um es auf Distributionen mit Debian- Geschmack zu installieren,script -ac 'command opts' ~/Documents/some_log.script
kann es zusätzlich in einem Terminal über so etwas wie überprüft werdenstrings ~/Documents/some_log.script | more
;strings
Dies ist eine einfache Möglichkeit, einige derscript
injizierten Elemente vorab zu bereinigen , um ausgefeiltere Methoden für die Wiedergabe / Anzeige zu ermöglichen . Ansonsten eine solide Antwort @Phishy, dennscript
auch interaktive Dinge bleiben erhalten.Weitere Informationen zur Funktionsweise finden Sie hier: http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/
quelle
tee
.