Linux-Shell: Wie füge ich der stderr-Nachricht einen Präfix-String hinzu?

2137
Fisher

Ich führe mehrere Aufgaben gleichzeitig im Hintergrund aus.

command_a | tee > command_a.log & command_b | tee > command_b.log & 

Wenn alles in Ordnung ist, werden Meldungen in Protokolldateien gespeichert.

Wenn etwas nicht stimmt, werden Fehler auf dem Bildschirm angezeigt.

Command_a und command_b sind sich jedoch sehr ähnlich, es ist schwer zu sagen, welche Fehlermeldung von welchem ​​Befehl generiert wird.

Kann ich Präfixzeichenfolge zu Fehlermeldungen hinzufügen, wie:

command_a: error 123 command_b: error 456 command_a: error 256 command_a: error 555 command_b: error 333 
3

1 Antwort auf die Frage

4
glenn jackman

Bash- Prozessersetzungen :

command_a 2> >(sed 's/^/command_a: /' >&2) > command_a.log & command_b 2> >(sed 's/^/command_b: /' >&2) > command_b.log & 

Sie müssen nicht weiterleiten, teewenn Sie nur stdout in eine Datei umleiten.

Sie können sogar ausgefallene Dinge wie das Drucken eines Zeitstempels ausführen:

$ { date echo stdout sleep 3 echo stderr >&2 } 2> >(gawk '' >&2) > file.log 
foobar: [2015-02-24 11:43:32] stderr 
$ cat file.log 
Tue Feb 24 11:43:29 EST 2015 stdout 

Stecken Sie es in eine Funktion zur Wiederverwendung:

log_stderr() { gawk -v pref="$1" '' >&2 }  command_a > command_a.log 2> >(log_stderr "command_a") 
Zu meinem Verständnis wird 2> alle stderr umleiten,> () wird zu einem Befehl umgeleitet, sed wurde zum Hinzufügen eines Präfixes verwendet, nachdem die sed-Nachricht zu stdout wurde,> & 2 die Nachricht zurück in stderr konvertieren und schließlich in die Protokolldatei speichern. Mein Verständnis ist richtig? Vielen Dank! @ Glenn Jackman Fisher vor 9 Jahren 0
ja, außer `> ()` wird "Prozessersetzung" genannt glenn jackman vor 9 Jahren 0
@Fisher möchten Sie vielleicht * eine Antwort annehmen, wenn Ihre Frage beantwortet wird (so sagen Sie "Danke") umläute vor 6 Jahren 0