मुझे कमांड-लाइन से वर्तमान टर्मिनल का नाम कैसे मिल सकता है?


25

क्या कमांड के साथ टर्मिनल का प्रकार प्राप्त करने की संभावना है?

अगर मैं उपयोग कर रहा हूं gnome-terminal, तो आउटपुट gnome-terminalया कुछ समान होना चाहिए । टर्मिनल का संस्करण प्राप्त करना भी अच्छा होगा।

अद्यतन करें

ps -aux | grep `ps -p $$ -o ppid=` 

कुछ इस तरह उत्पादन होगा:

user     4239  0.0  0.7 292708 15744 pts/8    Sl   11:39   0:02 xfce4-terminal
user     4800  0.0  0.0   6176   820 pts/0    S+   12:23   0:00 grep --color=auto  4239

यह भी xterm के साथ काम करेगा, लेकिन मुझे केवल नाम कैसे मिलेगा ( xfce4-terminalइस मामले में)?


मैंने सिर्फ एक अलग और बेहतर दृष्टिकोण के साथ अपना जवाब अपडेट किया। यदि आपके पास समय है, एक नज़र डालें और मुझे बताएं कि क्या यह आपके लिए भी काम करता है।
टेराडॉन

धन्यवाद, लेकिन rxvt के साथ पहली समस्या -> window 31457282 has no pid associated with it( लुबंटू पर परीक्षण)
तुकसन

ओह? अरे, यह अजीब है। मैंने दालचीनी के तहत परीक्षण किया।
टेराडॉन

जवाबों:


29

मूल संस्करण

ऐसा करने का एक तरीका आपके वर्तमान शेल सत्र की मूल प्रक्रिया को प्राप्त करना है और वहां से टर्मिनल का नाम है।

  1. वर्तमान शेल प्रक्रिया के जनक प्राप्त करें। बैश वैरिएबल $$आपके वर्तमान शेल का PID है, इसलिए हम इसे एक क्वेरी ps( -p $$) के रूप में दे सकते हैं और इसे tp को पेरेंट प्रोसेस की PID प्रिंट करने के लिए कह सकते हैं ( -o ppid=, ट्रेलिंग =कॉलम हेडर से बचने के लिए ट्रेलिंग है):

    $ ps -p $$ -o ppid=
    544
    

    तो, मेरे खोल के जनक की पीआईडी ​​है 544

  2. उस PID से संबद्ध प्रक्रिया प्राप्त करें और उसकी कमांड लाइन प्रिंट करें

    $ ps -p 544 o args=
    /usr/bin/python /usr/bin/terminator
    

    उपरोक्त आउटपुट इस बात पर निर्भर करेगा कि आप किस टर्मिनल एमुलेटर का उपयोग कर रहे हैं, मैं उपयोग कर रहा हूं terminator

  3. एक कमांड में सब कुछ मिलाएं

    ps -p $(ps -p $$ -o ppid=) o args=
    
  4. संस्करण प्राप्त करने के लिए इसका उपयोग करें

    $(ps -p $(ps -p $$ -o ppid=) o args=) --version
    terminator 0.97
    
  5. अपने लिए थोड़ा फ़ंक्शन जोड़ें जो आपके द्वारा ~/.bashrcउपयोग किए जा रहे टर्मिनल एमुलेटर का नाम और संस्करण लौटाता है (यह सबसे आम टर्मिनल एमुलेटर के लिए काम करता है):

    which_term(){
        term=$(ps -p $(ps -p $$ -o ppid=) -o args=);
        found=0;
        case $term in
            *gnome-terminal*)
                found=1
                echo "gnome-terminal " $(dpkg -l gnome-terminal | awk '/^ii/{print $3}')
                ;;
            *lxterminal*)
                found=1
                echo "lxterminal " $(dpkg -l lxterminal | awk '/^ii/{print $3}')
                ;;
            rxvt*)
                found=1
                echo "rxvt " $(dpkg -l rxvt | awk '/^ii/{print $3}')
                ;;
            ## Try and guess for any others
            *)
                for v in '-version' '--version' '-V' '-v'
                do
                    $term "$v" &>/dev/null && eval $term $v && found=1 && break
                done
                ;;
        esac
        ## If none of the version arguments worked, try and get the 
        ## package version
        [ $found -eq 0 ] && echo "$term " $(dpkg -l $term | awk '/^ii/{print $3}')    
    }
    

    अब आप टर्मिनल के नाम प्राप्त कर सकते हैं और यह भी (जैसे आप इसे चाहते किसी भी विकल्प पारित --version

विभिन्न टर्मिनलों का उपयोग करते हुए कुछ उदाहरण:

  1. xterm

    $ which_term
    XTerm(297)
    
  2. terminator

    $ which_term 
    terminator 0.97
    
  3. rxvt, यह कोई भी नहीं है -V, -versionया --versionझंडे किसी भी संस्करण जानकारी मुद्रित नहीं है।

    $  which_term
    rxvt  1:2.7.10-5
    
  4. gnome-terminal

    $ which_term
    gnome-terminal  3.10.1-1
    
  5. konsole

    $ which_term
    Qt: 4.8.6
    KDE Development Platform: 4.11.3
    Konsole: 2.11.3
    
  6. lxterminal

    $ which_term
    lxterminal  0.1.11-4
    
  7. xfce4-terminal

    $ which_term
    xfce4-terminal 0.6.2 (Xfce 4.10)
    
    Copyright (c) 2003-2012
        The Xfce development team. All rights reserved.
    
    Written by Benedikt Meurer <benny@xfce.org>
    and Nick Schermer <nick@xfce.org>.
    
    Please report bugs to <http://bugzilla.xfce.org/>.
    

नया और बेहतर

उपरोक्त दृष्टिकोण हालांकि उस भरोसेमंद नहीं है। जब आप अपने शेल suको किसी अन्य उपयोगकर्ता के पास भेजेंगे या जब आपका टर्मिनल कुछ और विभिन्न अन्य मामलों के लिए अलियास किया जाएगा तो यह चोक हो जाएगा । चूंकि हम स्पष्ट रूप से एक्स कार्यक्रमों के साथ काम कर रहे हैं, इसलिए बेहतर तरीका यह हो सकता है कि इसके बजाय सूचना प्राप्त करने के लिए कुछ xdotool( जैसे के साथ इंस्टॉल करने योग्य sudo apt-get install xdotool) का उपयोग किया जाए:

perl -lpe 's/\0/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline

ऊपर वर्तमान में सक्रिय विंडो को लॉन्च करने के लिए उपयोग की जाने वाली कमांड लाइन को प्रिंट करेगा। चूंकि आपके टर्मिनल, संभवतः, सक्रिय होंगे, यही वह कमांड है जो यह दिखाएगा। इसका मतलब यह है कि अधिकांश टर्मिनल एमुलेटर के लिए, आप सुरक्षित रूप से मान सकते हैं कि लौटाया गया 1 फील्ड टर्मिनल नाम है:

$ which_term 
lxterminal 

इसका मतलब है कि संस्करण प्राप्त करना तुच्छ है। उदाहरण के लिए

$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4

इसके लिए नहीं gnome-terminal:

$ which_term 
/usr/lib/gnome-terminal/gnome-terminal-server 

या terminator:

$ which_term
/usr/bin/python /usr/bin/terminator 

इसलिए, हम इसे थोड़ा और अधिक जटिल बना सकते हैं (यहाँ कुछ बशीज़ हैं, यह एक पोर्टेबल नहीं है)

which_term(){
    term=$(perl -lpe 's/\0/ /g' \
           /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline)

    ## Enable extended globbing patterns
    shopt -s extglob
    case $term in
        ## If this terminal is a python or perl program,
        ## then the emulator's name is likely the second 
        ## part of it
        */python*|*/perl*    )
         term=$(basename "$(readlink -f $(echo "$term" | cut -d ' ' -f 2))")
         version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
         ;;
        ## The special case of gnome-terminal
        *gnome-terminal-server* )
          term="gnome-terminal"
        ;;
        ## For other cases, just take the 1st
        ## field of $term
        * )
          term=${term/% */}
        ;;
     esac
     version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
     echo "$term  $version"
}

यह मेरे द्वारा परीक्षण किए गए सभी मामलों के लिए काम करता है।


@ Xubu-Tur hmm, मैंने केवल प्रत्येक टर्मिनल को दूसरे टर्मिनल से मैन्युअल रूप से लॉन्च करने की कोशिश की और यह ठीक काम किया। मैं अनुमान लगा रहा हूं कि आपके डेस्कटॉप पर्यावरण मेनू में एक अलग पथ है या किसी भी तरह से वे टर्मिनलों को लॉन्च करने के तरीके में भिन्न हैं। यदि आप मुझे बताएं कि आपने उन्हें कैसे लॉन्च किया और आपको क्या त्रुटि हुई, तो मैं आपको कुछ बेहतर दे सकता हूं। यदि आपने मेनू से लॉन्च किया है, तो जांच लें कि मेनू आइटम क्या कमांड चलाता है।
टेराडॉन

@ Xubu-Tur एक स्क्रीनशॉट नहीं जोड़ता है। बस अपने प्रश्न में त्रुटि संदेश पेस्ट करें। जो भी मेनू आइटम लॉन्च होता है उसके लिए समान है। मुझे मैन्युअल रूप से एक तस्वीर से कॉपी करने की उम्मीद न करें!
टेराडॉन

2
आप $PPIDमूल प्रक्रिया के PID प्राप्त करने के लिए उपयोग कर सकते हैं।
nyuszika7h

@ nyuszika7h हाँ आप कर सकते हैं और उसके लिए +1 लेकिन मैं नहीं कर सकता। मैं बस की जाँच की और यह में उपलब्ध नहीं है kshया tcsh। यह बैश परिवार के लिए एक बहुत अच्छा विचार है, हालांकि यह मेरे दृष्टिकोण से बहुत सरल है।
टेराडॉन

यह निश्चित रूप से में उपलब्ध है ksh93और mksh
nyuszika7h

8

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

ps -aux | grep `ps -p $$ -o ppid=` | awk 'NR==1{print $11}'

या

ps -aux | grep `ps -p $$ -o ppid=` | awk 'NR==1{print $NF}'

पहले पर विफल रहता है rxvtऔर terminatorदूसरा विफल रहता है uxtermऔर gnome-terminal(यह प्रिंट करता है /usr/lib/gnome-terminal/gnome-terminal-server)। यदि आप su सत्र का उपयोग कर रहे हैं तो वे सभी विफल हो जाएंगे (जैसा मेरा होगा)।
टेराडॉन

7
basename "$(cat "/proc/$PPID/comm")"

$PPIDशेल की मूल प्रक्रिया का PID है। कमांड काcomm मतलब है । यह एक पूर्ण पथ हो सकता है या नहीं भी हो सकता है, इसलिए हम जरूरत पड़ने पर पथ को हटाने के लिए उपयोग करते हैं ।basename

चेतावनियां

ये संभवत: कम से कम कुछ अन्य उत्तरों पर भी लागू होते हैं।

  • commतकनीकी रूप से argv[0], जो वास्तव में एक मनमाना स्ट्रिंग हो सकता है। लेकिन सामान्य तौर पर, आपको इस विशेष मामले के लिए उस पर भरोसा करने में सक्षम होना चाहिए।

  • यदि आप SSH या उपयोग tmux, screenया कुछ इसी तरह से जुड़ते हैं तो यह अपेक्षा के अनुरूप काम नहीं करेगा ।


यह बहुत अच्छा +1 है, लेकिन टर्मिनेटर टर्मिनल पर मुझे केवल terminआउटपुट मिलता है ।
तुकसन

मुझे पता नहीं क्यों, यह शायद टर्मिनेटर की गलती है।
nyuszika7h

ऐसा इसलिए है क्योंकि मुझे लगता है कि यह एक अजगर स्क्रिप्ट के रूप में चलाया गया है। इससे वाकई बहुत गुस्सा आता है।
टेराडॉन

कृपया ध्यान दें कि $PPIDसभी गोले में मानक नहीं है। उदाहरण के लिए tcshमैं मिलता हूं:PPID: Undefined variable.
arielf

2

आप निम्न आदेश आज़मा सकते हैं:

$ dpkg-query -W $COLORTERM
gnome-terminal  3.6.2-0ubuntu1

अद्यतन (ओपी और अविनाश राज को धन्यवाद):

$ dpkg-query -W $(ps -aux | grep "`ps -p $$ -o ppid=`" | awk 'NR==1{print $11}' | xargs basename)
rxvt    1:2.7.10-5

मुझे लगता है कि वह इसे सक्रिय टर्मिनल सत्र के लिए जानना चाहता है :) इसलिए यदि वह उस समय "पोटीन" का उपयोग कर रहा है ...
रिनविंड

"पोटीन" पर नहीं, लेकिन xterm के बारे में क्या, इस कमांड के साथ मुझे gnome-terminal 3.6.2-0ubuntu1lxterm भी मिलता है ?
तुकसन

2
यह आपके द्वारा उपयोग किए जा रहे टर्मिनल को प्रिंट नहीं करता है। यह जो कुछ भी डिफ़ॉल्ट $ COLORTERM सेट किया गया है, प्रिंट करता है, जिसका उस समय आपके द्वारा उपयोग किए जाने से कोई लेना-देना नहीं है।
टेराडॉन

अपडेट xterm के साथ भी अच्छा काम करता है और संस्करण और नाम दिखाता है।
तुकसन

सारा श्रेय @Avinash और आपको सही कमांड के लिए जाता है। मैंने अभी संस्करण जोड़ा है।
सिल्वेन पिनेउ

2

एक और (सही नहीं) संभावना है:

xprop -id $WINDOWID WM_CLASS | cut -d" " -f3 | sed 's/^.\(.*\)..$/\1/'

लेकिन यह lxterminal के साथ काम नहीं करता है क्योंकि वहाँ पर्यावरण चर $WINDOWIDखाली है ...

टर्मिनेटर "एक्स-टर्मिनल-एमुलेटर" नाम दिखाता है।


0

वर्तमान टर्मिनल को एक एस्केप सीक्वेंस के माध्यम से भी पता लगाया जा सकता है: उपकरण विशेषताएँ (द्वितीयक DA)

उदाहरण के लिए बैश में:

read -s -dc -p $'\E[>c' da;da=${da##$'\E'[>};echo "${da//;/ }"

यह केवल कुछ प्रकार की आईडी लौटाता है - और दुख की बात है कि मुझे आधिकारिक सूची नहीं पता है जो इनका वास्तविक नामों में अनुवाद करती है।


एक वास्तविक कार्यान्वयन के लिए, जो कुछ ज्ञात आईडी को टर्मिनल नामों में अनुवाद करता है, इस उदाहरण को bash script देखें: https://github.com/mintty/utils/blob/master/terminal

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