So protokollieren Sie die Ausgabe eines Teils eines Shell-Skripts

846
Carsten Scholtes

Ich suche nach einer prägnanten Lösung zum Protokollieren der Ausgabe eines Teils eines Shell-Skripts in eine Datei. Außerdem möchte ich immer noch die Lebensausgabe auf dem Bildschirm verfolgen können.

Von den Man-Seiten von "bash" (builtin exec, "Process Substitution") und tee, hätte ich erwartet, dass die folgende Zeile (die zu Beginn des zu protokollierenden Teils aufgerufen wird) eine Lösung sein wird:

exec >(tee -a logfile) 2>&1 

Leider führt dies zu Erlaubnisfehlern (sorry, Originalausgabe in deutscher Sprache):

$ bash t t: Zeile 1: /dev/fd/63: Keine Berechtigung t: Zeile 1: exec: /dev/fd/63: Kann nicht ausführen: Keine Berechtigung 

Das System basiert auf Ubuntu 12.04 LTS.

Wie protokolliert man einen Teil eines Skripts in einer Datei?

(Es wäre schwierig, den zu protokollierenden Teil in einer Funktion zu sammeln fund zu verwenden f | tee -a logfile, da sich der Teil über (Teile von) mehreren Funktionen erstreckt und ich logfiledazwischen wechseln möchte ...)

Danke im Voraus.

1
Was steht in deinem Skript `t`? ernie vor 10 Jahren 0
Die angezeigte Ausgabe erscheint, wenn "t" nur die einzige Zeile enthält "exec> (tee -a logfile) 2> & 1". Ich habe auch ein `echo" foo "` nach dieser Zeile hinzugefügt. Die resultierende Ausgabe ist genauso wie oben. Anscheinend wird das Skript unmittelbar nach Anzeige der Fehlermeldungen abgebrochen. Die Datei "Logfile" wird nicht einmal erstellt. Carsten Scholtes vor 10 Jahren 0

2 Antworten auf die Frage

2
mpy

Ich muss zugeben, ich bin mir nicht ganz sicher, was dein Ziel ist ... jedoch sollte der richtige Synat für deinen exec-Trick folgendermaßen lauten (du hast nur ein a verpasst >):

exec > >(tee -a logfile) 2>&1 

Eine einfache Demonstration:

% Katzentest #! / bin / bash  echo stdout nicht protokolliert echo stderr nicht protokolliert> & 2  exec>> (tee -a logfile) 2> & 1  echo stdout wird protokolliert echo stderr protokolliert> & 2  % bash test stdout nicht protokolliert stderr nicht protokolliert % stdout protokolliert stderr protokolliert  % cat logfile stdout protokolliert stderr protokolliert %  

Sie können sehen, dass die execAusgabe fehlerhaft ist, indem Sie die Aufforderung erneut drucken, wenn das Skript diese Zeile erreicht. Warum loggst du dich nicht zB stdout, aber nicht stderrvon deinem Skript?

% (echo stdout; echo stderr> & 2) | Abschlag-Logdatei stderr stdout % cat logfile stdout 
Vielen Dank, dass Sie meinen Syntaxfehler aufgezeigt und behoben haben. Der richtige Befehl ist genau das, wonach ich gesucht habe. Carsten Scholtes vor 10 Jahren 0
0
wingedsubmariner

Sie können die Zeilen, die Sie protokollieren möchten, in Klammern einschließen und die Ausgabe dann über tee weiterleiten:

echo this line isn\'t logged ( echo this line is logged! ) | tee log_file echo this line isn\'t logged 
Danke für deinen Vorschlag. Leider ist es schwierig, aus den gleichen Gründen zu erkennen, die es schwierig machen, das zu protokollierende Teil in einer Funktion zu erfassen. Carsten Scholtes vor 10 Jahren 0