GTK चेतावनियों और मेरे टर्मिनल की तरह आउटपुट से gedit (और अन्य कार्यक्रम) कैसे रोकें?


32

मैं रेयरिंग से अपग्रेड होने के बाद भरोसेमंद पर जबरदस्त विंडो मैनेजर चला रहा हूं। मेरे डेस्कटॉप वातावरण में जानबूझकर सभी Gnome / Freedesktop डेमन नहीं चल रहे हैं - मैं उन्हें नहीं चाहता।

जब मैं geditइस तरह से एक टर्मिनल से निष्पादित करता हूं :

gedit file

यह मेरे टर्मिनल पर इस तरह से संदेश भेजता है जब भी मैं प्रवेश करता हूं या विभिन्न अवसरों पर बचाता हूं या बचाता हूं:

(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

ये वर्कअराउंड स्वीकार्य नहीं हैं क्योंकि उन्हें प्रत्येक गनोम एप्लिकेशन पर व्यक्तिगत रूप से लागू किया जाना है - गेडिट केवल एक ही नहीं है जो टर्मिनल को गड़बड़ाना पसंद करता है।


2
आपके द्वारा उल्लिखित 3 विकल्पों का उपयोग क्यों नहीं किया जा सकता है?
टिम

मुझे नहीं लगता कि आप उन चेतावनियों को बंद कर सकते हैं, लेकिन @Tim ने पूछा कि आपके पास उन 3 विकल्पों का उपयोग करने के खिलाफ क्या है जो आपकी समस्या को हल करेंगे?
एलिफेंटपहास

7
धन्यवाद, मुझे पता है कि शेल पुनर्निर्देशन कैसे करना है। इसका कारण मैं यह नहीं करना चाहता (और स्पष्ट रूप से यह बताता हूं) कि ये चेतावनी कई अन्य कार्यक्रमों में भी दिखाई देती हैं। Dbus या जो भी घटक इन चेतावनियों को उत्पन्न करता है, उसके लिए एक विन्यास विकल्प, इसे उत्पन्न करने वाले सभी कार्यक्रमों के लिए चेतावनी को बंद कर देगा । पुनर्निर्देशन के साथ, मुझे प्रत्येक कार्यक्रम को व्यक्तिगत रूप से वर्कअराउंड (जो एक समाधान नहीं है) को लागू करना होगा।
FUZxxl

@FUZxxl मैं लगातार उत्पादन त्रुटियों के लिए अपने gedit प्राप्त नहीं कर सकता। लेकिन मैं उत्सुक हूँ अगर export GCONF_DEBUG="no"कुछ भी करोगे
Dan

@ dan08 नहीं, चाल नहीं चल रही।
फ़ूजएक्सएक्सएक्स

जवाबों:


17

सबसे पहले, मुझे यह भी कष्टप्रद लगता है कि ये चेतावनी एक आउट-ऑफ-द-बॉक्स उबंटू पर दिखाई देती है, जिसमें उन्हें अक्षम करने के लिए कोई "उचित" तरीका नहीं है जो मुझे मिल सकता है (ऐसा लगता है कि सबसे आम "समाधान" या तो स्थापित करना है 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"

यह एक बेहतरीन जवाब है। मैं भविष्य में इसका उपयोग करूंगा।
फूजेंकल

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

जो थोड़ा बेहतर लगता है। मैं वह परीक्षण करने जा रहा हूं।
फ़ूजएक्सएक्सएल

1

मैंने वास्तव में सी में छिपाने की चेतावनी लिखी थी, जो मुझे ऊपर दिखाई गई स्क्रिप्ट की तुलना में उपयोग करने में बहुत आसान लगती है। इसके अलावा, यह सब उत्पादन के लिए लिखा लिखेंगे stdoutडिफ़ॉल्ट रूप से (क्योंकि जीटीके और अन्य चेतावनी के लिए भेजा जाता stderrहै, तो यह पार्स stderrनहीं stdoutडिफ़ॉल्ट रूप से)।

उपरोक्त स्क्रिप्ट के साथ एक बड़ी समस्या यह है कि यह आपके कंसोल के लिए कुछ भी नहीं लिखेगा, भले ही यह रेगेक्स से मेल न खाता हो, जब तक कि यह पूरा नहीं हो जाता। ऐसा इसलिए है क्योंकि यह एक चर में सभी डेटा को बचाता है और फिर उस चर को एक बार पूरा करता है। इसका मतलब यह भी है कि यह उस चर में आउटपुट को संभवतः बहुत मेमोरी का उपयोग करके बचाएगा (कम से कम आपको इसे एक अस्थायी फ़ाइल में सहेजना चाहिए।) अंत में, मैं जो देख सकता हूं, उससे कोई भी एक लाइन मैच होने पर grep किसी भी प्रदर्शन को रोक देगा। । शायद वैसा नहीं जैसा आप चाहते हैं।

उपकरण का उपयोग इस तरह से एक साधारण उपनाम में किया जा सकता है:

alias gvim="hide-warnings gvim"

(मैं उपयोग करता हूं gvim... मुझे यकीन है कि यह geditभी साथ काम करेगा ।)

फ़ाइल स्वयं समाहित है, सी लाइब्रेरी के अलावा कोई निर्भरता नहीं है, इसलिए आप एक प्रति प्राप्त कर सकते हैं और आसानी से संकलित कर सकते हैं और इसे स्थापित कर सकते हैं:

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

फ़ाइल में कुछ और प्रलेखन है और आप --helpत्वरित डॉक्स के लिए संकलित एक बार उपयोग कर सकते हैं ।

नया संस्करण , जो किसी बिंदु पर advgetopt लाइब्रेरी का उपयोग करेगा, C ++ में है।


लिंक मर चुका है।
आर्मिन रिगो

@ArminRigo, आह! यह ले जाया गया। यहाँ मैंने लेटेस्ट से पहले एक नया लिंक डाला क्योंकि यह C ++ है। सी ++ संस्करण के लिए एक लिंक भी है। C संस्करण किसी भी अधिक नहीं बदलेगा।
एलेक्सिस विल्के

0

मैं इस तरह की समस्या को हल करने के लिए एक उपयोगिता ढूंढ रहा था, खुद।

दिए गए उत्तरों के साथ मेरे मुद्दे इस प्रकार हैं:

  • यह महत्वपूर्ण है कि stdout और stderr एक स्ट्रीम में एकत्रित न हों
  • मैं एक कमांड नहीं ला सकता, सभी आउटपुट को तब तक फ़िल्टर करता हूं जब तक कि यह समाप्त न हो जाए, और इसे अंत में प्रिंट करें (यानी समाधान को आउटपुट को सही तरीके से स्ट्रीम करना होगा)
  • मैं stdout और stderr संदेशों के आदेश को यथासंभव संरक्षित करना चाहूंगा

मैं बैश के साथ ऐसा करने के लिए किए गए प्रयासों की सराहना करता हूं, हालांकि, मैं एक समाधान की पहचान करने में विफल रहा, जिसने उपरोक्त उल्लिखित सभी स्थितियों को प्राप्त किया।

मेरा अंतिम समाधान NodeJS में लिखा गया है, जो मुझे लगता है कि कई लिनक्स बॉक्स पर स्थापित नहीं होगा। JS संस्करण लिखने से पहले, मैंने इसे अजगर में कोड करने का प्रयास किया, और पाया कि async IO लाइब्रेरी बहुत बदसूरत है और टूटी हुई है, जब तक कि अजगर के नए संस्करण (~ 3.5 जो कुछ नए डिस्ट्रोस से उपलब्ध नहीं है)।

निर्भरता को कम से कम करना अजगर को चुनने का एकमात्र कारण था, इसलिए मैंने इसे NodeJS के लिए छोड़ दिया, जिसमें कुछ निम्न-स्तर, async-उन्मुख 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'

आप जिस उपप्रकार को चलाने के लिए चुनते हैं, वह स्टड वारिस होगा, इसलिए आप BASH पाइप या पुनर्निर्देशन का उपयोग करने के लिए स्वतंत्र हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.