In Unix - Shell, habe ich eine env - Datei ( env - Datei die Parameter definiert , für den Betrieb des Benutzerskript wie Protokolldateinamen und den Pfad erforderlich, Umleitung Ausgänge und Fehler - Datei, Datenbankverbindungsdaten, etc. zu protokollieren ) , das leitet alle die Ausgänge ( Echo - Nachrichten ) und Fehler in der Protokolldatei aus dem ausgeführten Skript mit dem folgenden Code:
exec 1>>${LOG_FILE}
exec 2>>${LOG_FILE}
Die env-Datei wird am Anfang jedes Skripts ausgeführt. Aufgrund des obigen Codes in der env-Datei werden alle Konsolenausgaben, bei denen es sich möglicherweise um Benutzerausgaben oder Fehler handelt, direkt in die Protokolldatei ausgegeben, was ich tatsächlich benötigte.
Es gibt jedoch einige selektive Benutzerausgaben, die sowohl in der Konsole als auch in der Protokolldatei angezeigt werden sollen. Aber aufgrund des obigen Codes kann ich das nicht.
Ich weiß, dass ich, wenn ich den obigen Code entferne, das gewünschte Ergebnis für diesen Fall erzielen kann, aber ich muss alle anderen Ausgaben manuell in die Protokolldatei schreiben, was keine leichte Aufgabe ist.
Gibt es eine Möglichkeit, die Ausgabe sowohl in der Konsole als auch in der Protokolldatei abzurufen, ohne die obigen Codes zu entfernen?
/dev/fd/3
ist ein Dateiname, der sich auf "das aktuell geöffnete fd 3" bezieht, alsotee /dev/fd/3
schreibt alles, was auf seinem stdin ankommt, in fd 1 und auch in fd 3 (die/dev/fd/3
Datei). Fd 1 ist mit der Protokolldatei verbunden, Fd 3 ist mit der Konsole verbunden.echo "blah" | tee file1.txt | tee file2.txt >/dev/null
'Blah' wird nicht in file1.txt & file2.txt eingefügt, sondern nicht in die Konsole geschrieben.tee
, der wiederum auf das Terminal schreibt), anstatt direkt auf ein Terminal zuzugreifen, und ihre Ausgabe entsprechend anpassen.Ja, Sie möchten verwenden
tee
:Leiten Sie einfach Ihren Befehl an tee und übergeben Sie die Datei als Argument, wie folgt:
Dies druckt die Ausgabe in STDOUT und schreibt dieselbe Ausgabe in eine Protokolldatei. Siehe
man tee
für weitere Informationen.Beachten Sie, dass dadurch kein stderr in die Protokolldatei geschrieben wird. Wenn Sie also die beiden Streams kombinieren möchten, verwenden Sie:
quelle
script.sh: line 5: exec: 1: not found
Ich habe versucht, Joonty zu antworten, aber ich habe auch die bekommen
Error. Dies ist, was für mich am besten funktioniert ( bestätigt , dass es auch in zsh funktioniert):
Die Datei /tmp/both.log enthält anschließend
Das /tmp/both.log wird angehängt, es sei denn, Sie entfernen das -a vom Tee.
Hinweis:
>(...)
ist eine Prozesssubstitution. Damit kannexec
dertee
Befehl wie eine Datei ausgeführt werden.quelle
exec > >(tee ${LOG_FILE}) 2>&1
.Ich wollte Protokolle auf stdout und Protokolldatei zusammen mit dem Zeitstempel anzeigen. Keine der oben genannten Antworten hat bei mir funktioniert. Ich habe die Prozessersetzung und den Befehl exec verwendet und den folgenden Code gefunden. Beispielprotokolle:
Fügen Sie oben in Ihrem Skript die folgenden Zeilen hinzu:
Hoffe das hilft jemandem!
quelle
Für die Protokolldatei können Sie ein Datum eingeben, um Textdaten einzugeben. Der folgende Code kann helfen
Ausgabe: 2. Die Protokolldatei wird beim ersten Durchlauf erstellt und wird bei den nächsten Durchläufen weiter aktualisiert. Falls die Protokolldatei bei einer zukünftigen Ausführung fehlt, erstellt das Skript eine neue Protokolldatei.
quelle
Ich habe einen Weg gefunden, um die gewünschte Ausgabe zu erhalten. Obwohl es etwas unorthodox sein kann. Sowieso hier geht es. In der Datei redir.env habe ich folgenden Code:
Dann habe ich im eigentlichen Skript folgende Codes:
Hier Echo Ausgänge nur Konsole einzuloggen Ausgänge nur Datei und die Protokollmeldung Ausgänge sowohl an der Protokolldatei und Konsole.
Nach dem Ausführen der obigen Skriptdatei habe ich folgende Ausgaben:
In der Konsole
Für die Protokolldatei
Ich hoffe das hilft.
quelle
Versuchen Sie dies, es wird die Arbeit erledigen:
quelle
exec > >(tee -a ${log_file} )
funktioniert perfekt für meine Bedürfnisse. Frühere Lösungen oben haben Teile meines Skripts unterbrochen, die das Beenden erzwingen, wenn sie fehlschlagen. Vielen Dankquelle
Ich finde es sehr nützlich, sowohl stdout als auch stderr an eine Protokolldatei anzuhängen. Ich war froh, eine Lösung von alfonx mit zu sehen
exec > >(tee -a)
, weil ich mich fragte, wie ich dies mit erreichen könnteexec
. Ich bin auf eine kreative Lösung gestoßen, die die Syntax von here-doc verwendet und.
: /unix/80707/how-to-output-text-to-both-screen-and-file-inside-a-shell -SkriptIch habe festgestellt, dass in zsh die Here-Doc-Lösung mithilfe des Konstrukts "multios" geändert werden kann, um die Ausgabe sowohl in stdout / stderr als auch in die Protokolldatei zu kopieren:
Es ist nicht so lesbar wie die
exec
Lösung, bietet jedoch den Vorteil, dass Sie nur einen Teil des Skripts protokollieren können. Wenn Sie die EOF weglassen, wird das gesamte Skript natürlich mit Protokollierung ausgeführt. Ich bin nicht sicher, wiezsh
Multios implementiert werden, aber es kann weniger Overhead haben alstee
. Leider scheint es, dass man mit Multios nicht arbeiten kannexec
.quelle