Comment empêcher gedit (et les autres programmes) d’émettre des avertissements GTK dans mon terminal?

26

Je lance un gestionnaire de fenêtres génial sur fidèle après avoir effectué une mise à niveau de raring. Mon environnement de bureau n’a pas intentionnellement tous les démons Gnome / Freedesktop en cours d’exécution - je ne les veux pas.

Lorsque j'exécute gedit depuis un terminal comme celui-ci:

gedit file

Il émet des messages comme celui-ci sur mon terminal chaque fois que je clique sur Entrée ou sauvegarde ou à diverses autres occasions:

(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

Je comprends le sens de cet avertissement et j'ai décidé que cela ne comptait pas pour moi.

Comment puis-je désactiver ce type d’avertissement? Par "désactiver", je ne parle d'aucune de ces solutions de contournement:

  • transférer la sortie de gedit dans /dev/null
  • écrire un script wrapper qui dirige la sortie de gedit vers /dev/null
  • créer un alias qui redirige la sortie de gedit dans /dev/null

Ces solutions ne sont pas acceptables car elles doivent être appliquées individuellement à chaque application Gnome. Gedit n'est pas le seul à vouloir gâcher le terminal.

    
posée FUZxxl 01.08.2014 - 21:55
la source

4 réponses

12

D'abord, je trouve également ennuyeux que ces avertissements apparaissent sur un Ubuntu prêt à l'emploi, sans méthode "appropriée" pour les désactiver, que je pourrais trouver (il semble que la "solution" la plus courante soit soit pour installer gir1.2-gtksource-3.0 qui ne semble pas fonctionner depuis son installation, soit pour les ignorer - mais je veux les supprimer complètement car ils ne font que rendre mon terminal bruyant).

Je suis venu avec le code suivant qui semble se comporter exactement comme je l’espérais, et qui est basé sur la réponse de TuKsn, mais l’améliore un peu:

  • Travaillez par défaut ( gedit ... ) sans avoir à utiliser F12 ou un autre raccourci (pour appeler l'utilisation non filtrée /usr/bin/gedit ... ).
  • Affiche le nom de la commande saisie lorsqu'il se termine en tâche de fond.

Peut encore être généralisé, mais pour le moment, si vous avez besoin du même traitement pour les autres commandes, dupliquez la fonction gedit() pour chaque autre nom de commande nécessitant le même filtre.

# solution adapted from: https://ubuntuplace.info/questions/3838/comment-empecher-gedit-et-les-autres-programmes-demettre-des"$*" ]; 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) [email protected]
}

Et une meilleure version (beaucoup plus petite, entièrement générique, pas besoin de réécrire l’historique depuis invoqué tel quel, et meilleur pour le filtrage par ligne plutôt que pour la sortie entière):

# 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) "[email protected]" 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 ) \"[email protected]\" 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"
    
réponse donnée avih 12.01.2015 - 13:50
la source
2

C'est aussi une solution de contournement, mais vous n'avez pas à l'appliquer pour chaque application.

Ecrivez ceci à votre .bashrc et vous pouvez utiliser cette enveloppe avec F12 (ou choisir une autre clé) pour supprimer les avertissements:

# 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"'
    
réponse donnée TuKsn 02.08.2014 - 11:59
la source
1

J'ai en fait écrit l’outil masquer les avertissements dans C que je trouve beaucoup plus facile à utiliser que le script ci-dessus. En outre, il écrira toute la sortie écrite dans stdout par défaut (car le Gtk et les autres avertissements sont envoyés à stderr pour analyser stderr pas stdout par défaut).

Un gros problème avec le script ci-dessus est qu'il n'écrira rien sur votre console, même si cela ne correspond pas à l'expression rationnelle, jusqu'à ce que cela soit fait. C'est parce qu'il enregistre toutes les données dans une variable et ensuite grep cette variable une fois fait. Cela signifie également que cela sauvera la sortie dans cette variable en utilisant peut-être beaucoup de mémoire (au moins vous devriez enregistrer cela dans un fichier temporaire). Enfin, d'après ce que je peux voir, le grep empêchera tout affichage si une ligne correspond . Peut-être pas exactement ce que vous voulez.

L’outil peut être utilisé dans un alias simple comme celui-ci:

alias gvim="hide-warnings gvim"

(J'utilise gvim ... Je suis sûr que cela fonctionnerait avec gedit aussi.)

Le fichier est autonome, pas de dépendances autres que la bibliothèque C, vous pouvez donc obtenir une copie et la compiler et l'installer facilement:

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

Il existe une documentation supplémentaire dans le fichier et vous pouvez utiliser --help une fois compilé pour les documents rapides.

    
réponse donnée Alexis Wilke 16.12.2016 - 11:42
la source
0

Je cherchais un utilitaire pour résoudre ce genre de problème, moi-même.

Mes problèmes avec les réponses fournies sont les suivants:

  • il est important que stdout et stderr ne soient pas regroupés dans un seul flux
  • Je ne peux pas invoquer une commande, filtrer toute la sortie jusqu'à ce qu'elle se termine et l'imprimer à la fin (c'est-à-dire que la solution doit diffuser la sortie correctement)
  • J'aimerais conserver l'ordre des messages stdout et stderr autant que possible

J'apprécie les tentatives que j'ai vues pour faire cela avec Bash, cependant, je n'ai pas réussi à identifier une solution qui atteigne les trois conditions décrites ci-dessus.

Ma solution ultime est écrite dans NodeJS, qui, je crois, ne sera pas installée sur de nombreuses boîtes Linux. Avant de choisir d'écrire la version JS, j'ai essayé de le coder en python, et j'ai trouvé la bibliothèque asynchrone IO assez moche et cassée jusqu'aux versions TRES récentes de python (~ 3.5 disponible sur de nouvelles distributions).

La minimisation des dépendances était la SEULE raison de choisir python, alors je l’ai abandonnée pour NodeJS, qui possède un ensemble remarquable de bibliothèques pour des E / S asynchrones de bas niveau.

La voici:

#!/usr/bin/env nodejs

const spawn = require('child_process').spawn

function usage() {
    console.warn('Usage: filter-err <error regex> <cmd> [<cmd arg> ...]')
    process.exit(1)
}

function main(err_regex, cmd_arr) {
    let filter = new RegExp(err_regex)

    let proc = spawn(cmd_arr[0], cmd_arr.slice(1), {
        shell: true,
        stdio: ['inherit', 'inherit', 'pipe']
    })

    proc.stderr.on('data', (err) => {
        err = err.toString('utf8')

        if (! err.match(filter))
            process.stderr.write(err)
    })

    proc.on('close', (code) => process.exit(code))
}

const argv = process.argv

if (argv.length < 4)
    usage()
else
    main(argv[2], argv.slice(3))

Pour utiliser ce script, vous pouvez ajouter ces lignes à votre fichier .bashrc:

alias gimp='filter-err "GLib-[^ ]*-WARNING" gimp'

Le sous-processus que vous choisissez d'exécuter héritera de stdin, vous êtes donc libre d'utiliser les tuyaux ou la redirection BASH.

    
réponse donnée Shane 19.07.2018 - 12:50
la source

Lire d'autres questions sur les étiquettes