বর্তমানে কোন টার্মিনাল এমুলেটর ব্যবহার হচ্ছে তা কীভাবে পরীক্ষা করবেন?


15

আমি জিনোম-টার্মিনাল এবং গুয়াক ইনস্টল করেছি। আমি এই টার্মিনাল এমুলেটরগুলি শুরু হওয়ার সাথে সাথে প্রদর্শিত হতে বিভিন্ন স্টার্টআপ বার্তা দিতে চাই। .Bashrc এ আমি কী কোড লিখব যাতে এটি অর্জন করা যায়?

উত্তর:


10

এই ফাংশনটি কাজটি করা উচিত:

container() {
    pid=$$
    while true; do
        pid=$(ps -h -o ppid -p $pid 2>/dev/null)
        case $(ps -h -o comm -p $pid 2>/dev/null) in
        (gnome-terminal) echo "Running in gnome terminal";return;;
        (xterm) echo "Running in xterm";return;;
        (rxvt) echo "Running in rxvt";return;;
        (python) if [ ! -z "$(ps -h -o args -p $pid 2>/dev/null | grep guake)" ]; then echo "Running in Guake"; return; fi ;;
        esac
        [[ $(echo $pid) == 1 ]] && break
    done
}
container

চমৎকার উত্তর! containerসংজ্ঞা পরে ফাংশন কল করতে ভুলবেন না ।
রোশ

আমি প্রত্যাশা করেছিলাম এটি সুস্পষ্ট হবে তবে আপনি ঠিক বলেছেন, উত্তর অনুসারে আপডেট হয়েছে।
jlliagre

@ jlliagre আমি কোড চেষ্টা করেছিলাম। এটি জিনোম-টার্মিনালে সহজেই কাজ করে তবে গুয়াকে এটির সমস্যা রয়েছে। এটি কোনও আউটপুট দেয় না। পরিবর্তে এটি একরকম হিমশীতল যেমন অচলাবস্থায়। এটি ব্যবহার করতে আমার এটি Ctrl + C করতে হবে। কোডটি আসলে বুঝতে পারেনি তাই কোথায় ভুল হচ্ছে তা জানেন না।
বেদভালস

কোড স্থির। আমি মিস করেছি গুয়াকটি অজগর দ্বারা চালিত হয় এবং ফাংশনটি প্রস্থান করতে বাধা দেয় এমন একটি বাগ ছিল। সাহায্য করার জন্য ধন্যবাদ.
jlliagre

দুঃখিত, বন্ধু এখনও কাজ করে না। ত্রুটি দেয় bash: [: too many arguments। যদি সহায়তা করে তবে বাশ v4.2.24, পাইথন ভি 2.7.3 পেয়েছি।
বেদবালস

10

এটা চেষ্টা কর:

echo $TERM

এটি আরও প্রামাণিক, তবে আপনার প্রোগ্রামগুলি দ্বারা বিভ্রান্ত হতে পারে। তবে আমার ক্ষেত্রে, এটি বলে xtermএবং টিটিস-এ এটি বলে linux, যা আমার মনে হয় লিনাক্স কনসোলকে বোঝায়।


2
$TERMএকটি পরিবর্তনশীল যা আপনার ব্যবহার করা টার্মিনাল এমুলেটর দ্বারা স্ব-প্রতিবেদন হিসাবে স্পেসিফিকেশনকে বোঝায়, প্রকৃত এমুলেটর নিজেই নয়। উদাহরণস্বরূপ, আমার সিস্টেমে, আমি আসলে অ্যাক্সটারমিনাল চলমান থাকলেও echo $TERMফিরে আসে xterm। যা ঘটছে তা হ'ল এক্সটার্মিনাল স্ব-প্রতিবেদনের এক্সটার্ম সম্মতি। lxterminal আসলে সম্পূর্ণরূপে xterm অনুগত নয়, তাই আপনাকে নজরদারি করতে হবে। স্পেক ফাইলগুলি সাধারণত অবস্থিত /usr/share/terminfo
stazher

7

আপনি পিতামাতার প্রক্রিয়া নামটি গ্রেপ করে টার্মিনাল এমুলেটারের নাম পেতে পারেন। সুতরাং এটি প্রতিটি টার্মিনাল এমুলেটারের সাথে কাজ করে।

ব্যাশ, জেডএস, ইত্যাদিতে:

basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \  -f 4) | tail -1 | sed 's/^.* //')

ফিশ-শেল সহ:

basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \  -f 4) | tail -1 | sed 's/^.* //')

তবে মনে রাখবেন যে টার্মিনাল এমুলেটর যখন তাদের সাথে চালু হয় তখন এটি প্রোগ্রামের যুক্তিগুলি ধরবে।
রোববেনক্লেইন

আমি কি এসএসএইচ ব্যবহার করে সংযুক্ত থাকলে এই কাজ করবে?
ব্যবহারকারী3731622

@ user3731622 এটি হবে না! আপনাকে এটি ক্লায়েন্টের কাছ থেকে ফরওয়ার্ড করতে হবে।
এনরিকো

2

অনেকগুলি লিনাক্স সিস্টেমে echo $TERMরিটার্ন xtermউপরের stazher পোস্ট দেখুন।

প্রকৃত টার্মিনাল ব্যবহারে পেতে এটি করুন:

1: বর্তমানে চলমান প্রতিটি টার্মিনাল বন্ধ করুন।

2: আপনার স্বাভাবিক পদ্ধতিটি ব্যবহার করে নতুন টার্মিনালটি খুলুন।

3: নিম্নলিখিত কমান্ড লিখুন:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

4: রিটার্ন এমন কিছু হওয়া উচিত:

lxterminal --geometry=135x20

এখানে ভাঙ্গন:

সুতরাং: ps"প্রক্রিয়া স্থিতি"

পিএস বিকল্পটি -oহ'ল স্পেসের সাথে সম্পর্কিত তথ্য বা নির্দিষ্ট কীওয়ার্ডগুলির কমা দ্বারা পৃথক করা তালিকা প্রদর্শন করুন। জটিল মনে হচ্ছে, তবে আসলে তা নয়। (স্পেস বা কমা) পৃথক (কীওয়ার্ডের তালিকা) নির্দিষ্ট করা আছে।

সুতরাং, (কীওয়ার্ডগুলির তালিকা) তালিকার 'cmd='একমাত্র কীওয়ার্ড । সুতরাং, কেবল টার্মিনাল খোলার জন্য কমান্ড প্রদর্শন করতে বলছি।

পিএস অপশনটি -pহ'ল "প্রক্রিয়া আইডি দ্বারা" বাহ এই পিএস এর জন্য খুব সুন্দর বিকল্প। সমস্যাটি হ'ল, আপনাকে অবশ্যই এই প্রক্রিয়া আইডিটি পিএস করতে হবে। তাহলে, প্রক্রিয়া আইডি কিভাবে পাবেন? আমরা এক্সপ্রেশন প্রকাশ করি না $(ps -o 'ppid=' -p $$)

এখানে আমাদের আরও গভীর থেকে চিন্তা করতে হবে। আমি আশা করি আমি এই ব্যাশ ওয়ান-লাইনার আবিষ্কার করেছিলাম, তবে আমি তা করি নি। আমি মনে করি যে আমি এটি কোথাও https://wiki.archlinux.org/ থেকে চুরি করেছি , আমি আর খুঁজে পেলাম না। এই ছেলেরা অসাধারণ, তবে অনেক সময় তারা বুঝতে পারে না যে তারা কী বলবে অনেক গবেষণা করার পরে after আমরা যা করতে পারি তা হ'ল এটি এখন বুঝতে হবে, কারণ আমি ব্যাখ্যা করব।

সুতরাং আমরা জানি $ব্যাশে এক্সপেনশন অপারেটর। আমি "আন-মোড়ানো" ভাবতে পছন্দ করি। সুতরাং, $(foo -opt bar)"foo -opt বার" মোড়ক, বা প্রসারিত হবে। তবে ব্যাশে, একক রাউন্ড ব্রেস (...)সাবশেল খোলে।

সুতরাং, কন্যার শেল হিসাবে রান হিসাবে$(foo -opt bar) "foo -opt বার" প্রসারিত করে । খুব অদ্ভুত এবং বোঝা মুশকিল।

ঠিক আছে, সুতরাং এখন আমরা প্রায় একই ধরণের কমান্ডটি আবার চালাচ্ছি, ps -o 'ppid=' -p $$কিন্তু এবার পিএস, প্রক্রিয়া স্থিতি আমাদের দেখায় যে তিনি কন্যার শেল উদাহরণের মধ্যে থেকে কী দেখতে পাচ্ছেন ।

-oকীওয়ার্ডগুলির তালিকা, আগের মতো কেবল একটি কীওয়ার্ড তবে ppid=এটি প্যারেন্ট শেলের প্রসেস আইডির জন্য সরাসরি জিজ্ঞাসা করছে !! ডাক্তার শেল ছাড়া! খুব চালাক, হ্যাঁ? আমি যখন বুঝতে পারি তখন আমি খুব উত্তেজিত!

-pআবার, "প্রক্রিয়া আইডি দ্বারা" এবং ব্যাশে $$প্রক্রিয়া আইডি।

যদি আপনি কল করেন ps -o 'ppid=' -p $$বা অন্য কোনও কমান্ড $$সরাসরি প্রথম শেল থেকে সরাসরি জিজ্ঞাসা করেন , তিনি পিড = 1, বা পিড এক্স উইন্ডো, বা আপনার ডেস্কটপ প্রোগ্রাম থেকে বলতে পারেন, বা আপনি সম্ভবত শেলটির প্রকৃত পিড পাবেন। আপনি যদি অনেকবার জিজ্ঞাসা করেন তবে আপনি প্রতিবারই আলাদা উত্তর পেতে পারেন!

তবে, আপনি যদি কোনও মেয়েকে ডাকেন এবং তাকে "কে আপনার বাবা" জিজ্ঞাসা করেন তিনি আপনাকে বলবেন! খুব চালাক. আমি আশা করি আমি এই পদ্ধতিটি উদ্ভাবনের মতো এমন প্রতিভা হতে পারতাম।


ঠিক আছে সুতরাং AU একটি পোস্টের মধ্যে সঠিক ভাঙ্গন অনুমতি দেবে না। দুঃখিত, ব্লগ সিস্টেমের সাথে লড়াই করতে এবং একাধিক পোস্ট করতে রাজি নন। আপনি ধারণা পেতে পারেন।
stazher

আপনার অন্য উত্তরটি প্রশ্নের উত্তরের চেয়ে এই উত্তরের একটি পরিশীলিত এবং তথ্যবহুল মন্তব্য বলে মনে হচ্ছে ... আপনি নিজের দুটি উত্তরকে একটিতে মিশ্রিত করতে এবং তার মধ্যে একটি মুছতে এবং তাতে যুক্ত করতে পারলে দুর্দান্ত হবে প্রশ্নের পুরোপুরি উত্তর দেয়। মাঝখানে রেখা আঁকতে ---- ব্যবহার করবেন? একটি বোতামও আছে।
জান্না

আমি মনে করি আমি ওপি প্রশ্নের ঠিক উত্তর দিয়েছি, এবং বিশদভাবে। নীচে ভোট আনুন, আমি এটি অভ্যস্ত।
stazher

1
আমি মনে করি না যে আমি আপনার উপর ঝাঁপিয়ে পড়েছি, আমি কেবল পর্যালোচনা করছিলাম ... আপনার পোস্টটি আরও সম্পূর্ণ করার জন্য ধন্যবাদ
জান্না

আপনার প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ. আমি দুঃখিত, সম্ভবত আমি আপনাকে লাফিয়েছি। আমি খুব ক্ষমা চাই।
stazher

1

সহজ উপায় pstreeএবং ব্যবহার awk:

pstree -sA $$ | awk -F "---" '{ print $2 }'

ব্যাখ্যা

  1. সঙ্গে প্রক্রিয়ার একটি গাছ প্রদর্শন pstreeএর $$(atual প্রক্রিয়ার মধ্যে)।
  2. pstreeআর্গুমেন্ট:

    • -s: একটি প্রক্রিয়া এর পিতামাতার প্রদর্শন
    • -A: খাঁটি ASCII এ আউটপুট প্রদর্শন করুন।
  3. awkটুল একটি প্যাটার্ন স্ক্যান এবং -Fযুক্তি প্রসেস বিভক্ত করতে ব্যবহৃত হয়।

  4. শেষ '{ print $2 }'পর্যন্ত awkকেবল দ্বিতীয় ম্যাচের প্যাটার্ন আউটপুট করতে বলে (এই ক্ষেত্রে, টার্মিনাল এমুলেটারের নাম)।

আপনি কি সম্পর্কে নিশ্চিত $2? আমার ক্ষেত্রে যা পাইপ করা হয়েছে awkতা আসলে systemd---lightdm---lightdm---upstart---gnome-terminal----bash---pstree...
এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

নিবন্ধন করুন আপনার পর্যবেক্ষণের জন্য আপনাকে ধন্যবাদ। আমার ক্ষেত্রে টার্মিনাল এমুলেটর সরাসরি সিস্টেমড পরিষেবাতে সূচনা করে। আমি আবার কোডটি পরীক্ষা করে সংশোধন করে এডিট করি।
সিলবদেব

আমি যখন এমুলেটরটি চালু করতে কীবোর্ড শর্টকাট ব্যবহার করি তখন এটি কাজ করে না। এক্সএফসিইতে, আমি xfsettingsdযে টার্মিনালটি ব্যবহার করছি তার পরিবর্তে পাই।
মাইকেল হফম্যান

আপনি শেষ থেকে শুরু করলে আরও ভাল কাজ করে:pstree -sA $$ | head -n1 | awk -F "---" '{ print $(NF-1) }'
ডিসি

0

আপনি সঠিক, আমি কেবল শিরোনাম প্রশ্নের জন্য উত্তর তৈরি করেছি, শরীরে প্রশ্ন নয়। সুতরাং আপনি এখানে যান, এবং বব এর ইয়ার আঙ্কেল।

উপরের একটি উত্তরে কেস স্যুইচটি কী ছিল সে সম্পর্কে আমি নিশ্চিত নই। যেমন কেস সুইচ প্রয়োজন হয় না। আমার ~ / .bashrc স্ক্রিপ্টটি আসলে একটি সাধারণ লাইন, সমস্ত প্রতিধ্বনি কমান্ড কেবল মজাদার জন্য। কিভাবে ব্যাখ্যা...

যে কোনও শব্দ b / .bashrc পড়ার সময় শুরু হয় এবং সে .bashrc এ যা দেখতে পাবে ততক্ষণ আদেশ প্রয়োগ করে। সুতরাং, কোন শব্দটি বলা হোক না কেন, সে .bashrc পড়বে এবং কমান্ডগুলি সম্পাদন করবে, সুতরাং কেবলমাত্র বাশার্কের কাঠামোর প্রয়োজন একটি পদ বা অন্য পদটির আচরণ পরিবর্তন করতে বা বাদ দেওয়া। পছন্দসই আচরণ হ'ল প্রতিটি কমান্ড একই কমান্ড চালানোর জন্য, সুতরাং কেস স্যুইচ প্রয়োজন হয় না। টার্মিনাল নিজেই আপনাকে বলবে যে তাকে কীভাবে ডাকা হয়েছিল, সুতরাং আলাদা করার দরকার নেই।

দ্রষ্টব্য (1) আমি গুয়াকের জন্য পরীক্ষা করিনি, তবে জেলিয়াগ্র্রে প্রথম উত্তরে উল্লিখিত অন্য সকলের জন্য কাজ করে।

দ্রষ্টব্য (২) উইকির জন্য মার্কডাউনে ফর্ম্যাট করার কারণে আপনি প্রদর্শিত হিসাবে কাটা এবং পেস্ট করতে পারবেন না। আন্ডারলাইন চরিত্রগুলি মুছে ফেলা সহ আপনাকে অবশ্যই প্রতিটি ব্যাকটিকটি মুছতে হবে এবং এর আগে psবা পরে কোনও স্থান ছাড়াই প্রকৃত ব্যাকটিক যুক্ত করতে হবে -p $$)

script / .bashrc এর জন্য স্ক্রিপ্ট

# show welcome message for actual terminal in use
echo "Welcome.  You are attempting to use"
echo ""
echo _backtick_ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)_backtick_
echo ""
echo "Good Luck and God Speed."

এটা অনেক মজা ছিল। আমি এটি আমার নিজের ~ / .bashrc এ যুক্ত করেছি।


প্রতি নোট (1), টিল্ডায় পরীক্ষা করেছে, ভাল কাজ করে। গুয়াক টিলদার মতো, তবে অজগরে লেখা, তাই এখনও গুয়াক সম্পর্কে জানেন না।
stazher

0

আপনি যদি ব্যাশ ব্যবহার করছেন তবে আমার কাছে এই আদেশটি আপনাকে সহায়তা করবে:

which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))


0

আপনি যদি জেডএসএইচ ব্যবহার করে থাকেন তবে আরও ভাল (দ্রুত) সমাধান রয়েছে যা কেবল জেডএসএইচ বিল্টিন ব্যবহার করে এবং /proc/$pid/{stat,cmdline}সরাসরি ম্যানিপুলেট করে।

get-terminal-emulator() {
    if [[ $TTY = "/dev/tty"* ]]; then
        echo "linux-console"
        return
    fi
    local pid=$$ name=''
    while true; do
        proc_stat=(${(@f)$(</proc/${pid}/stat)})
        name=${proc_stat[2]//[()]/}
        case "${name}" in
            gnome-terminal|konsole|rxvt|xterm)
                echo "${name}"; return ;;
            python*)
                local cmdline=(${(@f)$(</proc/${pid}/cmdline)})
                if [[ "$cmdline" =~ "\\bguake.main\\b" ]]; then
                    echo "guake"; return
                fi
                ;;
        esac
        if test "$pid" = "1" -o "$pid" = ""; then
            echo "unknown"
            return
        fi
        pid=${proc_stat[4]}       
    done
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.