STDOUT & STDERR in eine Protokolldatei schreiben, STDERR auch in screen @ schreib

Ich möchte mehrere Befehle ausführen und alle Ausgaben in einer Protokolldatei erfassen. Ich möchte auch Fehler auf dem Bildschirm ausdrucken (oder die Ausgabe optional per E-Mail an jemanden senden).

Hier ist ein Beispiel. Der folgende Befehl führt drei Befehle aus und schreibt alle Ausgaben (STDOUT und STDERR) in eine einzelne Protokolldatei.

{ command1 && command2 && command3 ; } > logfile.log 2>&1

Hier ist, was ich mit der Ausgabe dieser Befehle machen möchte:

STDERR und STDOUT für alle Befehle werden in eine Protokolldatei geschrieben, falls ich sie später benötige. Normalerweise werde ich hier nicht nachsehen, es sei denn, es gibt Probleme. Drucken Sie STDERR auf dem Bildschirm (oder optional per Pipe nach / bin / mail), damit jeder Fehler auffällt und nicht ignoriert wird.

Es wäre schön, wenn die Rückkehrcodes noch verwendbar wären, damit ich etwas Fehlerbehandlung machen könnte. Vielleicht möchte ich eine E-Mail senden, wenn ein Fehler aufgetreten ist:

{command1 && command2 && command3; }> logfile.log 2> & 1 || mailx -s "Es ist ein Fehler aufgetreten" stefanl @ example.org

Das Problem, auf das ich stoße, besteht darin, dass STDERR während der E / A-Umleitung den Kontext verliert. Ein '2> & 1' konvertiert STDERR in STDOUT, und daher kann ich keine Fehler anzeigen, wenn ich 2> error.log @ mach

Hier sind ein paar saftigere Beispiele. Nehmen wir an, ich führe einige bekannte Build-Befehle aus, möchte aber nicht, dass der gesamte Build aufgrund eines einzigen Fehlers angehalten wird, und verwende daher das Flag "--keep-going".

{ ./configure && make --keep-going && make install ; } > build.log 2>&1

Oder, hier ist ein einfaches (und möglicherweise schlampiges) Skript zum Erstellen und Bereitstellen, das im Fehlerfall weiterarbeitet.

{ ./configure && make --keep-going && make install && rsync -av --keep-going /foo devhost:/foo} > build-and-deploy.log 2>&1

Ich denke, was ich will, beinhaltet eine Art vonBash I / O-Umleitung, aber ich kann das nicht herausfinden.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage