Como parar o gedit (e outros programas) de gerar avisos do GTK e afins no meu terminal?

25

Estou executando o gerenciador de janelas incrível no trusty depois de ter atualizado de raring. Meu ambiente de área de trabalho intencionalmente não possui todos os daemons do Gnome / Freedesktop em execução - não os quero.

Quando executo gedit de um terminal como este:

gedit file

Ele envia mensagens como esta por todo o meu terminal sempre que eu clico em enter, salva ou em várias outras ocasiões:

(gedit:5700): Gtk-WARNING **: Calling Inhibit failed: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.SessionManager was not provided by any .service files

Eu entendo o significado deste aviso e decidi que isso não importa para mim.

Como posso desativar este tipo de aviso? Por "desligar", não me refiro a nenhuma dessas soluções alternativas:

  • canalizando a saída do gedit para /dev/null
  • escrevendo um script de wrapper que canaliza a saída do gedit para /dev/null
  • criando um alias que canalize a saída do gedit para /dev/null

Essas soluções alternativas não são aceitáveis, já que precisam ser aplicadas individualmente a cada aplicativo Gnome - o gedit não é o único que gosta de atrapalhar o terminal.

    
por FUZxxl 01.08.2014 / 21:55

3 respostas

12

Primeiro, eu também acho irritante que esses avisos apareçam em um Ubuntu pronto para uso, sem o método "adequado" para desativá-los, o que eu pude encontrar (parece que a "solução" mais comum é ou para instalar o gir1.2-gtksource-3.0 , que parece não funcionar, já que ele já está instalado, ou para ignorá-los - mas eu quero suprimi-los completamente, já que eles apenas fazem meu terminal barulhento).

Eu criei o seguinte código que até agora parece se comportar exatamente como eu esperava, e é baseado na resposta do TuKsn, mas melhora um pouco para:

  • Trabalhe por padrão ( gedit ... ) sem precisar usar F12 ou algum outro atalho (para invocar o uso não filtrado /usr/bin/gedit ... ).
  • Exibe o nome do comando digitado quando ele termina como uma tarefa em segundo plano.

Ainda pode ser generalizado um pouco, mas por enquanto, se você precisar do mesmo tratamento para outros comandos, duplique a função gedit() para o outro nome de comando que precisa do mesmo filtro.

# solution adapted from: https://sobrelinux.info/questions/3747/how-to-stop-gedit-and-other-programs-from-outputting-gtk-warnings-and-the-like"$*" ]; then
        # write the real command to history without the prefix
        # syntax adapted from http://stackoverflow.com/questions/4827690
        history -s "$historyName ${@:2}"

        # catch the command output
        errorMsg=$( $* 2>&1 )

        # check if the command output contains not a (one of two) GTK-Warnings
        if ! $(echo $errorMsg | grep -q 'Gtk-WARNING\|connect to accessibility bus'); then
            echo $errorMsg
        fi
    fi
}
gedit() {
  suppress-gnome-warnings $FUNCNAME $(which $FUNCNAME) $@
}

E uma versão melhor (muito menor, totalmente genérica, não é necessário reescrever o histórico desde que seja invocado como está, e melhor para filtrar por linha, em vez de toda a saída):

# generates a function named  which:
# - executes $(which ) [with args]
# - suppresses output lines which match 
# e.g. adding: _supress echo "hello\|world"
# will generate this function:
# echo() { $(which echo) "$@" 2>&1 | tr -d '\r' | grep -v "hello\|world"; }
# and from now on, using echo will work normally except that lines with
# hello or world will not show at the output
# to see the generated functions, replace eval with echo below
# the 'tr' filter makes sure no spurious empty lines pass from some commands
_supress() {
  eval "() { $(which ) \"$@\" 2>&1 | tr -d '\r' | grep -v \"\"; }"
}

_supress gedit          "Gtk-WARNING\|connect to accessibility bus"
_supress gnome-terminal "accessibility bus\|stop working with a future version"
_supress firefox        "g_slice_set_config"
    
por avih 12.01.2015 / 13:50
2

É também uma solução alternativa, mas você não precisa aplicar isso em todos os aplicativos.

Escreva isso no seu .bashrc e você pode usar este wrapper com F12 (ou escolher outra chave) para suprimir os avisos:

# output filter
of() { 
    if [ -n "$*" ]; then   
        # write the real command to history without the prefix "of" 
        history -s "$*"

        # catch the command output
        errorMsg=$( $* 2>&1 )

        # check if the command output contains not a GTK-Warning
        if ! $(echo $errorMsg | grep -q 'Gtk-WARNING'); then
            echo $errorMsg 
        fi
    fi
}

# write the function "of" before every command if the user presses F12
bind '"\e[24~": "\e[1~ of \e[4~\n"'
    
por TuKsn 02.08.2014 / 11:59
1

Na verdade, eu escrevi a ferramenta de avisos de ocultação C, que eu acho muito mais fácil de usar do que o script mostrado acima. Além disso, ele gravará toda a saída gravada em stdout por padrão (porque o Gtk e outros avisos são enviados para stderr , portanto, ele analisa stderr não stdout por padrão).

Um grande problema com o script acima é que ele não gravará nada no seu console, mesmo que não corresponda ao regex, até que seja feito. Isso porque salva todos os dados em uma variável e, em seguida, usa essa variável uma vez concluída. Isso também significa que ele salvará a saída nessa variável, possivelmente usando muita memória (pelo menos você deve salvá-la em um arquivo temporário.) Finalmente, pelo que eu posso ver, o grep impedirá qualquer exibição se qualquer linha corresponder . Talvez não seja exatamente o que você quer.

A ferramenta pode ser usada em um simples alias como este:

alias gvim="hide-warnings gvim"

(Eu uso gvim ... tenho certeza que funcionaria com gedit também.)

O arquivo é autônomo, sem dependências além da biblioteca C, para que você possa obter uma cópia e compilar e instalar facilmente:

gcc hide-warnings.c -o hide-warnings
sudo cp hide-warnings /usr/bin/.

Existe alguma documentação adicional no arquivo e você pode usar --help uma vez compilado para documentos rápidos.

    
por Alexis Wilke 16.12.2016 / 11:42

Tags