
Estoy intentando suprimir GtkDialog
las advertencias en zenity
y yad
:
$ zenity --error --text hello
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
La redirección de errores y el filtrado funcionan:
$ zenity --error --text hello 2> >(grep -v GtkDialog >&2)
SÍ...¡¡El molesto mensaje de advertencia desaparece!!
Esto se puede colocar ~/.bashrc
para el trabajo de desarrollo como se responde aquí:
y aquí:
Sin embargo, al crear un script para que lo utilicen otros, no querrás tener que tener que cambiar su archivo ~/.bashrc
.
Tengo problemas para crear un atajo de escritura para: 2> >(grep -v GtkDialog >&2)
para usarlo dentro del script.
Por muchas razones, la asignación de variables GTK_SPAM="2> >(grep -v GtkDialog >&2)"
seguida posteriormente por el uso de variables "$GTK_SPAM"
no funciona.
alias zenity="zenity 2> >(grep -v GtkDialog >&2)"
antes de llamar al script funciona, pero no puedo usarlo dentro de un script.
Usar una matriz para mantener el método abreviado de escritura no funciona:
$ 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.
Encontré muchas respuestas genéricas excelentes sobre división de palabras y parámetros quedeberíaResuelvo mi problema pero se me escapa una sintaxis específica.
¿Alguna pista?
Respuesta1
No creo que la sintaxis por sí sola pueda ayudarle aquí, debido al orden en el que el shell configura las redirecciones y expande las variables. Para dar una ilustración muy simple:
$ arr=( ">" "/dev/null" )
$ set -x
$ echo foo "${arr[@]}"
+ echo foo '>' /dev/null
foo > /dev/null
es decir, todo se ha expandido "correctamente", pero > /dev/null
simplemente se ha convertido en una lista de argumentos de cadena pasados a echo
.
Túpodríaevaluación de fuerza usando eval
:
$ eval echo foo "${arr[@]}"
+ eval echo foo '>' /dev/null
++ echo foo
pero realmente sería mejor redirigir la transmisión mientras dure el script usando exec
:
exec 2> >(grep -v GtkDialog >&2)
o, si desea poder desactivar el filtro antes del final del script, entonces, segúnDespués de usar exec 1>file
, ¿cómo puedo detener esta redirección de STDOUT al archivo y restaurar el funcionamiento normal de STDOUT?debería ser posible hacer
exec 3>&2 2> >(grep -v GtkDialog >&2)
y luego más tarde
exec 2>&3 3>&-
para recuperar la secuencia duplicada.
Respuesta2
Puede definir y utilizar alias en su script si configura la expand_aliases
opción Shell, por ejemplo:
#!/bin/bash
shopt -s expand_aliases
alias zenity='zenity 2> >(grep -v GtkDialog >&2)'
…
Ahora cada zenity
línea se comporta como si 2> >(grep -v GtkDialog >&2)
se hubiera agregado y puede desactivar este comportamiento como de costumbre anteponiendo una barra invertida o command
:
\zenity # and
command zenity
ambos ignoran el alias.
Otras lecturas
Respuesta3
Puede utilizar la función en el script. zenity
y yad
tengo información útil en stdout, por lo que sugiero redirigir solo stderr a/dev/null
#/bin/bash
zen_nospam() {
zenity "$@" 2&>1 >(grep -v GtkDialog >&2)
}
zen_nospam --error --text hello
Por cierto, la función se puede definir en .bashrc si es necesario en la línea de comando, no en el script