How to stop gedit (and other programs) from outputting GTK warnings and the like in my terminal?

First, I also find it annoying that these warnings show up on an out-of-the-box Ubuntu, with no "proper" method to disable them which I could find (it seems that the most common "solution" is either to install gir1.2-gtksource-3.0 which doesn't seem to work since it's already installed, or to ignore them - but I want to suppress them completely since they just make my terminal noisy).

I came up with the following code which so far seems to behave exactly how I'd expect it to, and is based on the answer by TuKsn, but enhances it a bit to:

  • Work by default (gedit ...) without needing to use F12 or some other shortcut (to invoke unfiltered use /usr/bin/gedit ...).
  • Displays the entered command name when it terminates as a background task.

Can still be generalized a bit, but for now, if you need the same treatment for other commands, duplicate the gedit() function for each other command name which needs the same filter.

# solution adapted from: http://askubuntu.com/questions/505594
# TODO: use a list of warnings instead of cramming all of them to a single grep.
# TODO: generalize gedit() to allow the same treatment for several commands
#       without duplicating the function with only a different name
# output filter. takes: name_for_history some_command [arguments]
# the first argument is required both for history, but also when invoking to bg
# such that it shows Done <name> ... instead of e.g. Done /usr/bin/gedit ...
suppress-gnome-warnings() {
    # $1 is the name which should appear on history but is otherwise unused.
    historyName=$1
    shift

    if [ -n "$*" ]; 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) $@
}

And a better version (way smaller, fully generic, no need to rewrite history since invoked as is, and better for filtering per line rather than the whole output):

# generates a function named $1 which:
# - executes $(which $1) [with args]
# - suppresses output lines which match $2
# 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 "$1() { \$(which $1) \"\$@\" 2>&1 | tr -d '\r' | grep -v \"$2\"; }"
}

_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"

Its also a workaround, but you don't have to apply this for every application.

Write this to your .bashrc and you can use this wrapper with F12 (or chose another key) to suppress the warnings:

# 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"'

I actually wrote the hide-warnings tool in C which I find much easier to use than the script shown above. Also, it will write all the output written to stdout by default (because the Gtk and other warnings are sent to stderr so it parses stderr not stdout by default).

One big problem with the script above is that it won't write anything to your console, even if it does not match the regex, until done. This is because it saves all the data in a variable and then grep that variable once done. It also means that it will save the output in that variable possibly using a lot of memory (at least you should save that in a temporary file.) Finally, from what I can see, the grep will prevent any display if any one line matches. Maybe not exactly what you want.

The tool can be used in a simple alias like this:

alias gvim="hide-warnings gvim"

(I use gvim... I'm sure it would work with gedit too.)

The file is self contained, no dependencies other than the C library, so you can get a copy and easily compile and install it:

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

There is some further documentation in the file and you can use --help once compiled for quick docs.

The newer version, which at some point will make use of the advgetopt library, is in C++.

Tags:

Gtk

Gedit