
Estou tentando suprimir GtkDialog
avisos em zenity
e 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 ~/.bashrc
para 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/null
simplesmente 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_aliases
opção shell, por exemplo:
#!/bin/bash
shopt -s expand_aliases
alias zenity='zenity 2> >(grep -v GtkDialog >&2)'
…
Agora cada zenity
linha 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. zenity
e yad
tenho 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