Como faço para suprimir os avisos do GtkDialog no zenity e no yad usando o redirecionamento Bash em um script?

Como faço para suprimir os avisos do GtkDialog no zenity e no yad usando o redirecionamento Bash em um script?

Estou tentando suprimir GtkDialogavisos em zenitye yad:

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

O redirecionamento e a filtragem de erros funcionam:

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

SIM...Mensagem de aviso irritante desaparece!!

Isso pode ser colocado ~/.bashrcpara trabalho de desenvolvimento conforme respondido aqui:

e aqui:

Ao criar um script para outros usarem, você não quer que eles tenham que mudar seus arquivos ~/.bashrc.


Estou tendo problemas para criar um atalho de digitação para: 2> >(grep -v GtkDialog >&2)ser usado dentro do script.

Por vários motivos, a atribuição de variáveis GTK_SPAM="2> >(grep -v GtkDialog >&2)"​​seguida posteriormente pelo uso de variáveis "$GTK_SPAM"​​não funciona.

alias zenity="zenity 2> >(grep -v GtkDialog >&2)"antes de chamar o script funciona, mas não posso usar isso em um script.

Usar uma matriz para armazenar o atalho de digitação não está funcionando:

$ 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.

Encontrei muitas respostas genéricas excelentes sobre divisão de palavras e parâmetros quedeveresolver meu problema, mas uma sintaxe específica me escapa.

Alguma pista?

Responder1

Não acho que a sintaxe por si só possa ajudá-lo aqui - por causa da ordem em que o shell configura redirecionamentos e expande variáveis. Para dar uma ilustração muito simples:

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

ou seja, tudo foi expandido "corretamente", mas > /dev/nullsimplesmente se tornou uma lista de argumentos de string passados ​​para echo.

Vocêpoderiaavaliação de força usando eval:

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

mas realmente seria melhor redirecionar o fluxo durante o seu script usando exec:

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

ou, se você quiser desligar o filtro antes do final do script, com base emDepois de usar exec 1>file, como posso interromper esse redirecionamento do STDOUT para arquivo e restaurar o funcionamento normal do STDOUT?deveria ser possível fazer

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

e depois

exec 2>&3 3>&-

para recuperar o fluxo duplicado.

Responder2

Você pode definir e usar aliases em seu script se definir a expand_aliasesopção shell, por exemplo:

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

Agora cada zenitylinha se comporta como se 2> >(grep -v GtkDialog >&2)tivesse sido adicionada e você pode desativar esse comportamento normalmente adicionando uma barra invertida ou command:

\zenity        # and
command zenity

ambos ignoram o alias.

Leitura adicional

Responder3

Você pode usar a função no script. zenitye yadtenho informações úteis em stdout, então sugiro redirecionar apenas stderr para/dev/null

#/bin/bash

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

zen_nospam --error --text hello

aliás, a função pode ser definida em .bashrc se necessário na linha de comando, não no script

informação relacionada