Wie unterdrücke ich GtkDialog-Warnungen in Zenity und Yad mithilfe der Bash-Umleitung in einem Skript?

Wie unterdrücke ich GtkDialog-Warnungen in Zenity und Yad mithilfe der Bash-Umleitung in einem Skript?

Ich versuche, GtkDialogWarnungen in zenityund zu unterdrücken yad:

$ zenity --error --text hello
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

Fehlerumleitung und -filterung funktioniert:

$ zenity --error --text hello 2> >(grep -v GtkDialog >&2)

JA...Nervige Warnmeldung verschwindet!!

~/.bashrcDies kann für Entwicklungsarbeiten eingesetzt werden und wird hier beantwortet:

und hier:

Wenn Sie jedoch ein Skript für die Verwendung durch andere erstellen, möchten Sie diese nicht mit der Änderung ihrer belasten ~/.bashrc.


Ich habe Probleme beim Erstellen einer Tastenkombination für: 2> >(grep -v GtkDialog >&2)zur Verwendung im Skript.

Aus vielen Gründen funktioniert die Variablenzuweisung GTK_SPAM="2> >(grep -v GtkDialog >&2)"mit anschließender Variablenverwendung nicht."$GTK_SPAM"

alias zenity="zenity 2> >(grep -v GtkDialog >&2)"vor dem Aufruf des Skripts funktioniert, aber ich kann dies nicht innerhalb eines Skripts verwenden.

Die Verwendung eines Arrays zum Speichern der Tippkombination funktioniert nicht:

$ aGtkSpam=(2\> \>\(grep -v GtkDialog \>\&2\))

$ DumpArray "${aGtkSpam[@]}"
Array Elements:
0: 2>
1: >(grep
2: -v
3: GtkDialog
4: >&2)

$ zenity --error --text hello "${aGtkSpam[@]}"
This option is not available. Please see --help for all possible usages.

$ yad --text hello 2> >(grep -v GtkDialog >&2)

$ yad --text hello "${aGtkSpam[@]}"
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

Ich fand viele hervorragende allgemeine Antworten zum Thema Worttrennung und Parameter, diesollenlöse mein Problem, aber mir fällt keine bestimmte Syntax ein.

Irgendwelche Hinweise?

Antwort1

Ich glaube nicht, dass Ihnen die Syntax allein hier weiterhelfen kann – wegen der Reihenfolge, in der die Shell Umleitungen einrichtet und Variablen erweitert. Um ein sehr einfaches Beispiel zu geben:

$ arr=( ">" "/dev/null" )
$ set -x
$ echo foo "${arr[@]}"
+ echo foo '>' /dev/null
foo > /dev/null

d. h. alles wurde „richtig“ erweitert, > /dev/nullist aber einfach zu einer Liste von Zeichenfolgenargumenten geworden, die an übergeben wurden echo.

DukönnteKraftauswertung mittels eval:

$ eval echo foo "${arr[@]}"
+ eval echo foo '>' /dev/null
++ echo foo

aber eigentlich wäre es besser, den Stream für die Dauer Ihres Skripts umzuleiten, und zwar mit exec:

exec 2> >(grep -v GtkDialog >&2)

oder, wenn Sie den Filter vor dem Ende des Skripts ausschalten möchten, dann basierend aufWie kann ich nach der Verwendung exec 1>filediese Umleitung von STDOUT in eine Datei stoppen und den normalen Betrieb von STDOUT wiederherstellen?es sollte möglich sein

exec 3>&2 2> >(grep -v GtkDialog >&2)

und dann später

exec 2>&3 3>&-

um den duplizierten Stream wiederherzustellen.

Antwort2

Sie können Aliase in Ihrem Skript definieren und verwenden, wenn Sie die expand_aliasesShell-Option festlegen, z. B.:

#!/bin/bash
shopt -s expand_aliases
alias zenity='zenity 2> >(grep -v GtkDialog >&2)'

Jetzt zenityverhält sich jede Zeile so, als wäre 2> >(grep -v GtkDialog >&2)sie hinzugefügt worden. Sie können dieses Verhalten wie üblich deaktivieren, indem Sie einen Backslash voranstellen oder command:

\zenity        # and
command zenity

beide ignorieren den Alias.

Weiterführende Literatur

Antwort3

Sie können die Funktion im Skript verwenden zenityund yadhaben nützliche Informationen in stdout, daher schlage ich vor, nur stderr umzuleiten auf/dev/null

#/bin/bash

zen_nospam() {
  zenity "$@" 2&>1 >(grep -v GtkDialog >&2)
}

zen_nospam --error --text hello

Übrigens kann die Funktion bei Bedarf in der Befehlszeile und nicht im Skript in .bashrc definiert werden

verwandte Informationen