আমার টার্মিনালে জিটিকে সতর্কতা এবং এর মতো আউটপুট থেকে জিডিট (এবং অন্যান্য প্রোগ্রামগুলি) কীভাবে থামানো যায়?


32

রেরিং থেকে আপগ্রেড করার পরে আমি ভরসা উইন্ডো ম্যানেজারটি চালাচ্ছি। আমার ডেস্কটপ পরিবেশে ইচ্ছাকৃতভাবে সমস্ত জিনোম / ফ্রিডেস্কটপ ডেমোন চলমান নেই - আমি সেগুলি চাই না।

যখন আমি 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
  • একটি উপাধি তৈরি করা যা গেডিট আউটপুটকে পাইপ করে /dev/null

এই কাজের ক্ষেত্রগুলি গ্রহণযোগ্য নয় কারণ এগুলি প্রতিটি জিনোম অ্যাপ্লিকেশনটিতে স্বতন্ত্রভাবে প্রয়োগ করতে হবে - জিডিট একমাত্র টার্মিনালটিকে বিশৃঙ্খলা করতে পছন্দ করে না।


2
আপনি উল্লিখিত 3 টি বিকল্প কেন ব্যবহার করতে পারবেন না?
টিম

আমি মনে করি না আপনি এই সতর্কতাগুলি বন্ধ করতে পারেন, তবে @ টিম জিজ্ঞাসা অনুসারে, আপনার সমস্যার সমাধান করবে এমন 3 টি বিকল্প ব্যবহার করার বিরুদ্ধে আপনার কী আছে?
এলিফ্যান্টফেজ

7
ধন্যবাদ, আমি জানি কিভাবে শেল পুনর্নির্দেশ করতে হয়। আমি এটি করতে না চাওয়ার কারণটি (এবং স্পষ্টভাবে উল্লেখ করে) যে এই সতর্কতাগুলি অন্যান্য অনেক প্রোগ্রামেও উপস্থিত হয়। ডিবিবাসের জন্য একটি কনফিগারেশন বিকল্প বা যে কোনও উপাদান যা এই সতর্কতাগুলি উত্পন্ন করে তা উত্পন্ন করে এমন সমস্ত প্রোগ্রামের জন্য সতর্কতাটি বন্ধ করে দেবে । পুনঃনির্দেশের সাথে, আমাকে প্রতিটি প্রোগ্রামে পৃথকভাবে workaround (যা সমাধান নয়) প্রয়োগ করতে হবে।
এফইউজেডএক্সএল

@FUZxxl আমি নিয়মিত আউটপুট ত্রুটিতে আমার জেডিটটি পেতে পারি না। তবে আমি আগ্রহী যে export GCONF_DEBUG="no"কিছু করতে চাইলে
ড্যান

@ dan08 নাহ, চালাকি করছেন না।
FUZxxl

উত্তর:


17

প্রথমত, আমি এটি বিরক্তিকরও বোধ করি যে এই সতর্কতাগুলি বাক্সের বাইরে উবুন্টুতে প্রদর্শিত হয়েছে, আমি খুঁজে পেতে পারি যা তাদের অক্ষম করার জন্য কোনও "যথাযথ" পদ্ধতি নেই (মনে হয় সর্বাধিক সাধারণ "সমাধান" হয় ইনস্টল করা gir1.2-gtksource-3.0এটি ইতিমধ্যে ইনস্টল হওয়ার পরে বা এটিকে উপেক্ষা করার কারণে এটি কাজ করে না বলে মনে হচ্ছে - তবে তারা কেবল আমার টার্মিনালটি গোলমাল করে দেওয়ার কারণে আমি তাদের পুরোপুরি দমন করতে চাই)।

আমি নিম্নলিখিত কোডটি নিয়ে এসেছি যা এখন পর্যন্ত মনে হচ্ছে ঠিক কীভাবে এটির প্রত্যাশা করছিলাম তা আচরণ করে এবং এটি টুকসনের উত্তরের উপর ভিত্তি করে তৈরি হয়েছে তবে এটি কিছুটা বাড়িয়ে তুলেছে:

  • ডিফল্ট ( gedit ...) দ্বারা এফ 12 বা অন্য কিছু শর্টকাট ব্যবহার না করে (অসম্পূর্ণ ব্যবহারের জন্য অনুরোধ করা /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এবং সতর্কতা দমন করতে আপনি এফ 12 (বা অন্য কোনও কী চয়ন করেছেন) দিয়ে এই মোড়ক ব্যবহার করতে পারেন:

# 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

1

আমি আসলে সি -তে লুকানো-সতর্কতা সরঞ্জাম লিখেছিলাম যা আমি উপরে প্রদর্শিত স্ক্রিপ্টের চেয়ে বেশি সহজে ব্যবহার করতে পারি। এছাড়াও, এটি stdoutডিফল্টরূপে লিখিত সমস্ত আউটপুট লিখবে (কারণ Gtk এবং অন্যান্য সতর্কতা প্রেরণ করা হয়েছে stderrযাতে এটি ডিফল্টরূপে পার্স হয় stderrনা stdout)।

উপরের স্ক্রিপ্টের একটি বড় সমস্যা হ'ল এটি সম্পন্ন হওয়া অবধি রেজেক্সের সাথে মেলে না, এমনকি আপনার কনসোলটিতে কিছু লিখবে না। এর কারণ এটি একটি ভেরিয়েবলের সমস্ত ডেটা সংরক্ষণ করে এবং তারপরে একবার পরিবর্তন হয়ে যায় gre এর অর্থ হ'ল এটি সেই পরিবর্তনশীলটিতে আউটপুট সংরক্ষণ করবে সম্ভবত অনেকগুলি মেমরি ব্যবহার করে (কমপক্ষে আপনাকে এটি একটি অস্থায়ী ফাইলে সংরক্ষণ করা উচিত)) পরিশেষে, আমি যা দেখতে পাচ্ছি তার থেকে গ্রেপ কোনও ডিসপ্লে প্রতিরোধ করবে যদি কোনও লাইন মেলে তবে । আপনি ঠিক কি চান না।

সরঞ্জামটি এর মতো একটি সাধারণ উرفে ব্যবহার করা যেতে পারে:

alias gvim="hide-warnings gvim"

(আমি ব্যবহার করি gvim... আমি নিশ্চিত যে এটি geditখুব কার্যকর হবে।)

ফাইলটি স্বয়ংসম্পূর্ণ, সি লাইব্রেরি ব্যতীত অন্য কোনও নির্ভরতা নেই, তাই আপনি একটি অনুলিপি পেতে এবং সহজেই এটি সংকলন এবং ইনস্টল করতে পারেন:

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

ফাইলটিতে আরও কিছু ডকুমেন্টেশন রয়েছে এবং আপনি --helpএকবার দ্রুত ডক্সের জন্য সংকলিত ব্যবহার করতে পারেন ।

নতুন সংস্করণ , যা এক পর্যায়ে অ্যাডগ্রেটপট লাইব্রেরিটি ব্যবহার করবে, এটি সি ++ এ রয়েছে।


লিঙ্কটি মারা গেছে।
আর্মিন রিগো

@ আর্মিনরিগো, আহ! এটা সরানো। সরানোর আগে আমি এখানে একটি নতুন লিঙ্ক রেখেছি কারণ এখন এটি সি ++। সি ++ সংস্করণে একটি লিঙ্কও রয়েছে। সি সংস্করণ আর পরিবর্তন হবে না।
অ্যালেক্সিস উইল্ক

0

আমি নিজেই এই ধরণের সমস্যা সমাধানের জন্য একটি ইউটিলিটি সন্ধান করছি।

প্রদত্ত উত্তরের সাথে আমার সমস্যাগুলি নিম্নরূপ:

  • এটি গুরুত্বপূর্ণ যে স্টাডাউট এবং স্টাডার এক স্রোতে একত্রিত না হয়
  • আমি কোনও আদেশ দিতে পারি না, শেষ না হওয়া পর্যন্ত সমস্ত আউটপুট ফিল্টার করতে পারি না এবং শেষ পর্যন্ত মুদ্রণ করতে পারি (অর্থাত সমাধানটি আউটপুটটি সঠিকভাবে প্রবাহিত করতে পারে)
  • আমি যতটা সম্ভব স্টডআউট এবং স্ট্যাডার বার্তাগুলির ক্রম সংরক্ষণ করতে চাই

আমি বাশের সাথে এটি করার জন্য যে প্রচেষ্টা দেখেছি তার প্রশংসা করি, তবে, আমি উপরে বর্ণিত শর্তগুলির 3 টি অর্জনকারী একটি সমাধান সনাক্ত করতে ব্যর্থ হয়েছি।

আমার চূড়ান্ত সমাধানটি নোডজেএস-এ লেখা হয়েছে, যা আমি বুঝতে পেরেছি যে অনেকগুলি লিনাক্স বাক্সে ইনস্টল করা হবে না। জেএস সংস্করণটি লেখার আগে, আমি এটি অজগরটিতে কোড দেওয়ার চেষ্টা করেছি এবং পাই যে অ্যাসিঙ্ক আইও গ্রন্থাগারটি পাইথনের খুব সাম্প্রতিক সংস্করণ (~.~ ডলার যা কিছু নতুন ডিস্রোস-এ-বাক্সে উপলব্ধ।

নির্ভরতা হ্রাস করা কেবলমাত্র পাইথন বেছে নেওয়ার কারণ ছিল, তাই আমি এটিকে নোডজেএস-এর জন্য ছেড়ে দিয়েছি, যা কিছুটা নিম্ন-স্তরের, অ্যাসিঙ্ক-ভিত্তিক আইওয়ের জন্য উল্লেখযোগ্য গ্রন্থাগার রয়েছে।

এটা এখানে:

#!/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 পাইপ বা পুনঃনির্দেশ ব্যবহার করতে পারবেন are

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.