ubuntuusers.de

Warnmeldung eines Terminal-Programms mit grep o.ä. unterdrücken?

Status: Gelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

Udalrich

Anmeldungsdatum:
15. Mai 2019

Beiträge: 533

Servus zusammen,

Manches im Terminal gestartete Programm gibt für den Benutzer unnötige Warnmeldungen aus, welche ich gerne unterdrücken würde, ohne jedoch Fehlermeldungen allgemein zu unterdrücken. Wie ginge das?

Beispiel: evince gibt manchmal eine Warnung aus, obwohl dann alles geht:

$ evince datei.ps
(evince:3235): GLib-GObject-WARNING **: 06:54:23.303: invalid cast from 'PSDocument' to 'EvDocumentLinks'

Solche Warnungen oder Fehler kännen durch Umleitung des Fehlerausgabestroms (2) ganz unterdrückt weden:

evince datei.ps  2> /dev/null

Aber dann werden auch echte Fehlermeldungen unterdrückt, z.B. wenn evince die zu öffnende Datei nicht findet. Das möchte ich nicht.

Mit grep --invert-match kann ich zwar aus der Ausgabe eines Programms mißliebige Zeilen herausfiltern, aber Warn- und Fehlermeldungen kommen trotzdem durch.

echo Zeile mit WARNING Ende | grep --invert-match "WARNING"
<Keine Ausgabe, wie erwartet.>

Hingegen schlüpft bei:

evince datei.ps | grep --invert-match "WARNING"

… dennoch die eingangs zitierte Warnmeldung durch:

(evince:3235): GLib-GObject-WARNING […]

Gibt es da einen Schalter oder ein Werkzeug für diesen Zweck? Danke.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Kann man machen, ist etwas aufwändiger. Wenn Du dies in ein Skript packst, kannst Du damit die Fehlerausgabe beliebiger Prozesse filtern.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/sh

[ -z "$DEBUG" ] || set -x

# create a pipe reliably
until pipe=$(mktemp --quiet --dry-run) && mkfifo "$pipe"; do :; done

# ensure pipe is removed at the end
trap 'rm -f "$pipe"' 0

# now do the work with filtering of messages
fgrep -vw WARNING --line-buffered < "$pipe" >&2 &
( "$@" ) 2> "$pipe"

Ich habe es mit diesem Skript erfolgreich ausprobiert:

1
2
3
4
5
6
#!/bin/sh

echo message
echo WARNING >&2
echo ERROR >&2
echo message

Ausgabe

1
2
3
4
5
6
7
$ ./filter ./warn 
message
message
ERROR
$ ./filter ./warn 2>/dev/null
message
message

Optionen von fgrep in Zeile 12 musst Du nach Bedarf anpassen. Vielleicht willst Du ja auch egrep -vi --line-buffered 'warning|info' o.ä. verwenden oder die Zeilenpufferung weglassen.

Udalrich

(Themenstarter)

Anmeldungsdatum:
15. Mai 2019

Beiträge: 533

Super. Vielen Dank!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

Wieso nicht einfach:

1
evince datei.ps 2>&1 | grep -v "WARNING"

Udalrich

(Themenstarter)

Anmeldungsdatum:
15. Mai 2019

Beiträge: 533

Genial. An die Möglichkeit, den Fehlerstrom (2) auf den Standardstrom zu lenken und das Bündel zu filtern, wäre ich gar nicht gekommen. Linux überrascht mich ständig positiv. Der Ideenreichtum vieler Benutzer hier im Forum ebenfalls.

Vielen Dank an User_unknown und Rklm für die tolle Hilfe.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Udalrich schrieb:

Genial. An die Möglichkeit, den Fehlerstrom (2) auf den Standardstrom zu lenken und das Bündel zu filtern, wäre ich gar nicht gekommen.

Naja, der Nachteil ist, dass dann alles in einem Strom ist. Ich war davon ausgegangen, dass es in Deinem Fall sinnvoll ist, die Trennung aufrecht zu erhalten. Vielleicht willst Du ja die Fehlermeldungen gefiltert umleiten. Wenn Du das nicht brauchst, ist die Lösung von user_unknown natürlich viel besser.

Linux überrascht mich ständig positiv. Der Ideenreichtum vieler Benutzer hier im Forum ebenfalls.

Vielen Dank an User_unknown und Rklm für die tolle Hilfe.

Bitte.

Antworten |