
Ich versuche, GtkDialog
Warnungen in zenity
und 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!!
~/.bashrc
Dies 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/null
ist 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>file
diese 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_aliases
Shell-Option festlegen, z. B.:
#!/bin/bash
shopt -s expand_aliases
alias zenity='zenity 2> >(grep -v GtkDialog >&2)'
…
Jetzt zenity
verhä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 zenity
und yad
haben 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