当前位置: 首页>>技术教程>>正文


如何阻止gedit(和其他程序)在我的终端上输出GTK警告等信息?

,

问题描述

从稀疏升级后,我就在Trusted上运行了出色的窗口管理器。我的桌面环境故意没有运行所有Gnome /Freedesktop守护程序-我不希望它们。

当我从这样的终端执行gedit时:

gedit file

每当我按下Enter或保存或在其他各种情况下,它都会在我的终端上输出这样的消息:

(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

我了解此警告的含义,因此我认为这对我来说无关紧要。

如何关闭这种警告?通过”turn off”,我并不意味着这些或类似的解决方法中的任何一种:

  • 将gedit的输出传递到/dev/null

  • 编写包装脚本,将gedit的输出通过管道传递到/dev/null

  • 创建一个别名,将gedit的输出传递到/dev/null

这些变通办法是不可接受的,因为它们必须分别应用于每个Gnome应用程序-gedit并不是唯一一个喜欢弄乱终端的程序。

最佳答案

首先,我也感到很讨厌,这些警告显示在out-of-the盒Ubuntu上,没有”proper”方法可以禁用它们(我发现最常见的”solution”要么是安装gir1.2-gtksource-3.0,但似乎无法正常工作) (因为它已经安装了,或者可以忽略它们)-但我想完全抑制它们,因为它们只会使我的终端嘈杂)。

我提出了以下代码,到目前为止,这些代码似乎完全符合我的期望,并且基于TuKsn的回答,但将其增强为:

  • 默认情况下可以工作(gedit ...),而无需使用F12或其他快捷方式(要调用未过滤的使用/usr/bin/gedit ...)。

  • 在作为后台任务终止时显示输入的命令名称。

仍然可以概括一下,但是现在,如果您需要对其他命令进行相同的处理,请为每个需要相同过滤器的命令名称复制gedit()函数。

# 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) $@
}

还有一个更好的版本(更小,完全通用,因为按原样调用而无需重写历史记录,并且更好地过滤每行而不是整个输出):

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9377.html,未经允许,请勿转载。