वर्तमान में किस टर्मिनल एमुलेटर का उपयोग किया जा रहा है, इसकी जांच कैसे करें?


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 मैंने कोड की कोशिश की। यह सूक्ति-टर्मिनल पर सुचारू रूप से काम करता है लेकिन इसे गुएक पर एक समस्या है। यह कोई आउटपुट नहीं देता है। इसके बजाय यह इस तरह की जमावट करता है जैसे कि गतिरोध में। मुझे इसे इस्तेमाल करने के लिए Ctrl + C करना होगा। कोड को वास्तव में समझ में नहीं आया इसलिए यह नहीं पता कि यह गलत कहाँ है।
वेदवल्स

कोड तय किया। मुझे याद आया कि अजगर अजगर द्वारा चलाया जाता है और फंक्शन को बाहर निकलने से रोकने वाला एक बग था। प्रतिक्रिया के लिए धन्यवाद।
jlliagre

सॉरी यार, अभी भी काफी काम नहीं है। त्रुटि देता है bash: [: too many arguments। अगर यह मदद करता है bash v4.2.24, अजगर v2.7.3 समझे।
वेदवल्स

10

इसे इस्तेमाल करे:

echo $TERM

यह अधिक आधिकारिक है, लेकिन आपके कार्यक्रमों द्वारा गड़बड़ की जा सकती है। हालाँकि, खान पर, यह कहता है xtermऔर ttys पर यह कहता है linux, जो मुझे लगता है कि लिनक्स कंसोल के लिए खड़ा है।


2
$TERMएक चर है, जो आपके द्वारा उपयोग किए जा रहे टर्मिनल एमुलेटर द्वारा स्वयं-सूचना के रूप में विनिर्देशन को संदर्भित करता है, वास्तविक एमुलेटर को नहीं। उदाहरण के लिए, अपने सिस्टम पर, echo $TERMरिटर्न xtermभले ही मैं वास्तव में lxterminal चल रहा हूँ। क्या हो रहा है lxterminal स्व-रिपोर्ट xterm अनुपालन है। lxterminal वास्तव में पूरी तरह से xterm अनुरूप नहीं है, इसलिए आपको बाहर देखना होगा। कल्पना फाइलें आमतौर पर स्थित होती हैं /usr/share/terminfo
stazher

7

आप माता-पिता की प्रक्रिया के नाम को पकड़कर, टर्मिनल एमुलेटर नाम प्राप्त कर सकते हैं। इसलिए यह हर टर्मिनल एमुलेटर के साथ काम करता है।

बाश में, zsh, आदि:

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/^.* //')

हालांकि, ध्यान दें कि जब टर्मिनल एमुलेटर उनके साथ लॉन्च किया जाता है, तो यह प्रोग्राम के तर्कों को पकड़ लेगा।
रोबोबेनकलीन

अगर मैं SSH का उपयोग करके जुड़ा हुआ हूं तो क्या यह काम करता है?
user3731622

@ user3731622 यह नहीं होगा! आपको इसे क्लाइंट से फॉरवर्ड करना होगा।
एनरिको 3

2

कई लिनक्स सिस्टम echo $TERMरिटर्न में xtermऊपर स्टेज़र पोस्ट देखें।

उपयोग में वास्तविक टर्मिनल प्राप्त करने के लिए, यह करें:

1: वर्तमान में चल रहे प्रत्येक टर्मिनल उदाहरण को बंद करें।

2: अपने सामान्य तरीके का उपयोग करके नया टर्मिनल खोलें।

3: निम्नानुसार कमांड दर्ज करें:

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

4: रिटर्न कुछ इस तरह होना चाहिए:

lxterminal --geometry=135x20

यहाँ ब्रेकडाउन है:

तो: ps"प्रक्रिया की स्थिति" है

पीएस विकल्प -oनिर्दिष्ट खोजशब्दों की सूची या अल्पविराम से अलग सूची के साथ जुड़ी जानकारी है। जटिल लगता है, लेकिन वास्तव में नहीं है। (स्थान या अल्पविराम) अलग (कीवर्ड की सूची) निर्दिष्ट।

तो, (खोजशब्दों की सूची) है 'cmd=' केवल एक कीवर्ड है। इसलिए, बस टर्मिनल खोलने के लिए कमांड प्रदर्शित करने के लिए कहें।

ps विकल्प -p "by process id" वाह यह ps के लिए बहुत अच्छा विकल्प है। समस्या यह है कि, आपको यह प्रक्रिया आईडी पीएस पास करनी होगी। तो, प्रक्रिया आईडी कैसे प्राप्त करें? हम अभिव्यक्ति को उजागर करते हैं $(ps -o 'ppid=' -p $$)

यहां हमें थोड़ा गहराई से सोचना शुरू करना चाहिए। काश मैंने इस बैश वन-लाइनर का आविष्कार किया, लेकिन मैंने नहीं किया। मुझे लगता है कि मैंने इसे चुरा लिया है https://wiki.archlinux.org/ है, कहीं मुझे फिर से नहीं मिला। वे लोग कमाल के हैं, लेकिन कई बार मैं यह नहीं समझ पाता कि वे बहुत अध्ययन के बाद क्या करना चाहते हैं। हम क्या कर सकते हैं, इसे अभी समझना है, क्योंकि मैं समझाऊंगा।

इसलिए हम जानते हैं कि $बैश में विस्तार ऑपरेटर है। मुझे "अन-रैप" सोचना पसंद है। तो, $(foo -opt bar)"खोल-बार बार" को खोलना, या विस्तारित करना होगा। लेकिन बैश में, सिंगल राउंड ब्रेस(...) सबशेल खुल जाता है।

इसलिए, बेटी के गोले में$(foo -opt bar) "फू-दॉप बार" को चलाएं । बहुत अजीब और समझने में मुश्किल।

ठीक है, इसलिए अब हम लगभग समान कमांड को फिर से चला रहे हैं, ps -o 'ppid=' -p $$लेकिन इस बार पीएस, प्रक्रिया की स्थिति, हमें दिखाती है कि वह क्या देख सकता है बेटी खोल उदाहरण के भीतर से

-oकीवर्ड की सूची, पहले की तरह केवल एक कीवर्ड, लेकिन ppid=यह सीधे पेरेंट शेल के प्रोसेस आईडी के लिए पूछ रहा है !! बिना डुबकी शेल से!बहुत चालाक, हाँ? जब मैं यह समझ सकता हूं तो मैं बहुत उत्साहित हूं!

-p फिर, "प्रोसेस आईडी द्वारा" और बैश में $$ में प्रोसेस आईडी है।

यदि आप फोन करते हैं ps -o 'ppid=' -p $$, या कोई अन्य कमांड मांगते हैं$$ पहले शेल से सीधे , तो वह pid = 1 कह सकता है, या xWindow से पिड, या आपके डेस्कटॉप प्रोग्राम से, या हो सकता है कि आपको शेल का वास्तविक पीआईडी ​​मिल जाए। यदि आप कई बार पूछते हैं, तो आपको हर बार अलग-अलग उत्तर मिल सकते हैं!

लेकिन, यदि आप एक बेटी को आमंत्रित करते हैं और उससे पूछते हैं कि "कौन आपका डैडी है" तो वह आपको बताएगी! बहुत चालाक। काश मैं इस विधि का आविष्कार करने के लिए इस तरह के जीनियस हो सकता।


ठीक है इसलिए एयू एक पद के भीतर उचित टूटने की अनुमति नहीं देगा। क्षमा करें, ब्लॉग सिस्टम से लड़ने और कई पोस्ट करने के लिए तैयार नहीं है। शायद आपको अंदाजा हो जाए।
stazher

आपका अन्य उत्तर प्रश्न के उत्तर के बजाय इस उत्तर पर एक परिष्कृत और सूचनात्मक टिप्पणी लगता है ... यह बहुत अच्छा होगा यदि आप अपने दो उत्तरों को एक में जोड़ सकते हैं और उनमें से एक को हटा सकते हैं, और इसे जोड़ सकते हैं ताकि यह पूरी तरह से सवाल का जवाब। उपयोग ---- बीच में एक रेखा खींचने के लिए? एक बटन भी है।
ज़न्ना

मुझे लगता है कि मैंने ओपी प्रश्न का ठीक-ठीक और विस्तार से उत्तर दिया है। ब्लॉग एडिट सिस्टम को समझने और खत्म करने से पहले आप मुझ पर कूद पड़े। नीचे के वोटों पर लाओ, मुझे इसकी आदत है।
stazher

1
मुझे नहीं लगता कि मैं आप पर कूद गया, मैं सिर्फ समीक्षा कर रहा था ... आपके पोस्ट को और अधिक पूरा करने के लिए धन्यवाद
Zanna

आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे क्षमा करें, शायद मैं आप पर कूद पड़ा। मैं बहुत माफी मांगता हूं।
बाज़र

1

उपयोग करना pstreeऔर awkसबसे आसान तरीका है:

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

की व्याख्या

  1. साथ प्रक्रियाओं की एक पेड़ प्रदर्शित pstreeकी $$(atual प्रक्रिया)।
  2. pstreeतर्क:

    • -s: एक प्रक्रिया के माता-पिता को प्रदर्शित करें
    • -A: शुद्ध ASCII में प्रदर्शन आउटपुट।
  3. awkउपकरण एक पैटर्न स्कैन और -Fतर्क प्रक्रियाओं विभाजित करने के लिए प्रयोग किया जाता है।

  4. अंत में केवल 2 मैच पैटर्न (इस मामले में, टर्मिनल एमुलेटर नाम) को आउटपुट '{ print $2 }'करने के awkलिए कहता है ।

क्या आपको यकीन है $2? मेरे मामले में, awkवास्तव में क्या पाइप किया गया है systemd---lightdm---lightdm---upstart---gnome-terminal----bash---pstree...
एनरिको मारिया डे एंजेलिस

@EnricoMariaDeAngelis हां। आपके अवलोकन के लिए धन्यवाद। मेरे मामले में टर्मिनल एमुलेटर सीधे सिस्टमड सेवा में शुरू होता है। मैं फिर से कोड की जांच करता हूं और इसे सुधार के साथ संपादित करता हूं।
सिल्वदेव

जब मैं एमुलेटर लॉन्च करने के लिए कीबोर्ड शॉर्टकट का उपयोग करता हूं तो यह काम नहीं करता है। XFCE पर, मैं xfsettingsdउस टर्मिनल के बजाय मिलता हूं जिसका मैं उपयोग कर रहा हूं।
माइकल हॉफमैन

यदि आप अंत से शुरू करते हैं तो बेहतर काम करता है:pstree -sA $$ | head -n1 | awk -F "---" '{ print $(NF-1) }'
lleaff

0

आप सही हैं, मैंने केवल हेडलाइन प्रश्न के लिए उत्तर दिया, शरीर में प्रश्न नहीं। तो यहाँ तुम जाओ, और बॉब के यार अंकल।

मुझे यकीन नहीं है कि मामला स्विच के बारे में था, ऊपर दिखाए गए एक उत्तर में। ऐसे केस स्विच की जरूरत नहीं है। मेरी ~ / .bashrc स्क्रिप्ट वास्तव में केवल एक सरल रेखा है, सभी इको कमांड केवल मनोरंजन के लिए हैं। कैसे समझा उ...

पढ़ते समय कोई भी शब्द ~ / .bashrc पढ़ता है, और वह जो भी आदेशों को .bashrc में देखेगा उसे निष्पादित करता है। तो, कोई फर्क नहीं पड़ता कि किस शब्द को कहा जाता है, वह .bashrc पढ़ेगा और कमांड निष्पादित करेगा, इसलिए .bashrc में केवल आवश्यक संरचना को एक शब्द या किसी अन्य के व्यवहार को संशोधित या बाहर करना होगा। वांछित व्यवहार हर शब्द के लिए एक ही कमांड निष्पादित करने के लिए है, इसलिए केस स्विच की आवश्यकता नहीं है। टर्मिनल खुद आपको बताएगा कि उसे कैसे बुलाया गया था, इसलिए अंतर करने की कोई आवश्यकता नहीं है।

नोट (1) मैंने गाइके के लिए परीक्षण नहीं किया, लेकिन पहले जवाब में उल्लिखित सभी अन्य लोगों के लिए काम करता है।

नोट (2) विकी के लिए मार्कडाउन में फॉर्मेटिंग के कारण, आप कट और पेस्ट नहीं कर सकते हैं जैसा कि दिखाया गया है। आपको प्रत्येक बैकटिक को हटाना होगा , जिसमें अंडरलाइन वर्णों को हटाना और वास्तविक बैकटिक जोड़ना होगा, जिसमें पहले psया बाद में कोई स्थान नहीं है -p $$)

स्क्रिप्ट के लिए ~ / .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

यदि आप ZSH का उपयोग कर रहे थे, तो एक बेहतर (तेज) समाधान है, जो केवल ZSH बिल्डरों का उपयोग करता है और /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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.