¿Cómo suprimo las advertencias de GtkDialog en zenity y yad usando la redirección Bash en un script?

¿Cómo suprimo las advertencias de GtkDialog en zenity y yad usando la redirección Bash en un script?

Estoy intentando suprimir GtkDialoglas advertencias en zenityy 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 ~/.bashrcpara 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/nullsimplemente se ha convertido en una lista de argumentos de cadena pasados ​​a echo.

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_aliasesopción Shell, por ejemplo:

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

Ahora cada zenitylí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. zenityy yadtengo 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

información relacionada