gedit(およびその他のプログラム)が端末でGTK警告などを出力しないようにするにはどうすればよいですか?


32

raringからアップグレードした後、信頼できるウィンドウマネージャーを実行しています。私のデスクトップ環境では、すべての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

私はこの警告の意味を理解しており、それは私には関係ないと判断しました。

この種の警告をオフにするにはどうすればよいですか?「オフにする」ということは、これらの回避策や同様の回避策を意味するものではありません。

  • geditの出力をパイプする /dev/null
  • geditの出力をパイプするラッパースクリプトを記述する /dev/null
  • geditの出力をパイプするエイリアスを作成する /dev/null

これらの回避策は、各Gnomeアプリケーションに個別に適用する必要があるため、受け入れられません。端末を台無しにするのが好きなのはgeditだけではありません。


2
言及した3つのオプションを使用できないのはなぜですか?
ティム14

これらの警告をオフにできるとは思いませんが、@ Timが尋ねたように、問題を解決する3つのオプションを使用することに対して何がありますか?
ElefantPhace 14

7
おかげで、私はシェルのリダイレクトを行う方法を知っています。私がこれをしたくない(そしてそれを明示的に述べた)理由は、これらの警告が他の多くのプログラムにも現れるからです。dbusまたはこれらの警告を生成するコンポーネントの構成オプションは、警告を生成するすべてのプログラムの警告をオフにします。リダイレクトでは、回避策(解決策ではありません)を各プログラムに個別に適用する必要があります。
FUZxxl 14

@FUZxxl geditで一貫してエラーを出力することはできません。しかし、私はexport GCONF_DEBUG="no"何かをしたい場合は興味があります
ダン14

@ dan08いや、トリックをやっていない。
FUZxxl 14

回答:


17

最初に、これらの警告がすぐに使えるUbuntuに表示され、それらを無効にする「適切な」方法がないために見つけることができます(最も一般的な「解決策」はインストールすることです)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"

これは素晴らしい答えです。将来的にこれを使用します。
FUZxxl

2

これも回避策ですが、すべてのアプリケーションに適用する必要はありません。

これを書いて、.bashrcこのラッパーをF12で使用して(または別のキーを選択して)警告を抑制することができます:

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

それは少し良く見えます。私はそれをテストします。
FUZxxl 14

1

私は実際にCでhide-warningsツールを書いたので、上に示したスクリプトよりもずっと使いやすいと思います。また、stdoutデフォルトで書き込まれるすべての出力を書き込みます(Gtkおよびその他の警告が送信されるstderrため、デフォルトでは解析されstderrませんstdout)。

上記のスクリプトの大きな問題の1つは、正規表現と一致しなくても、完了するまでコンソールに何も書き込まないことです。これは、すべてのデータを変数に保存し、一度その変数をgrepするためです。また、おそらく大量のメモリを使用して、その変数に出力を保存することを意味します(少なくとも一時ファイルに保存する必要があります)。 。たぶんあなたが望むものではないかもしれません。

このツールは、次のような簡単なエイリアスで使用できます。

alias gvim="hide-warnings gvim"

(私は使用していgvimます...それでも動作するはずですgedit。)

ファイルは自己完結型であり、Cライブラリ以外の依存関係がないため、コピーを取得して簡単にコンパイルおよびインストールできます。

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

ファイルにはさらにいくつかのドキュメントがあり、使用できます --help、簡単なドキュメント用にコンパイルし。

ある時点でadvgetoptライブラリを使用する新しいバージョンは、C ++です。


リンクは無効です。
アーミンリゴ

@ArminRigo、ああ!動いた。ここでは、C ++になったため、移動する前に最新のリンクを追加しました。C ++バージョンへのリンクもあります。Cバージョンは変更されません。
アレクシスウィルク

0

私は自分でこの種の問題を解決するユーティリティを探していました。

提供された回答に関する私の問題は次のとおりです。

  • stdoutとstderrが1つのストリームに集約されないことが重要です
  • コマンドを呼び出し、終了するまですべての出力をフィルタリングし、最後に出力することはできません(つまり、ソリューションは出力を適切にストリーミングする必要があります)
  • stdoutおよびstderrメッセージの順序を可能な限り保持したい

Bashを使用してこれを実行しようとした試みを評価していますが、上記の3つの条件すべてを達成したソリューションを特定できませんでした。

私の究極のソリューションはNodeJSで書かれており、多くのLinuxボックスにはインストールされないことを理解しています。JSバージョンを作成する前に、Pythonでコーディングしようとしましたが、非同期IOライブラリは非常にく、Pythonの非常に最近のバージョン(一部の新しいディストリビューションですぐに使用できる〜3.5)まで壊れていることがわかりました。

依存関係を最小限に抑えることがpythonを選択する唯一の理由だったため、NodeJSにはそれを放棄しました。NodeJSには、やや低レベルの非同期指向のIO用の顕著なライブラリセットがあります。

ここにあります:

#!/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))

このスクリプトを使用するには、次の行を.bashrcに追加します。

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

実行することを選択したサブプロセスはstdinを継承するため、BASHパイプまたはリダイレクトを自由に使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.