কমান্ড-লাইন থেকে আমি কীভাবে বর্তমান টার্মিনালের নাম পেতে পারি?


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

এটি এক্সটার্মের সাথেও কাজ করবে, তবে আমি কীভাবে কেবল নাম ( xfce4-terminalএই ক্ষেত্রে) পাব ?


আমি আমার উত্তরটি আলাদা এবং আরও ভাল পদ্ধতির সাথে সবেমাত্র আপডেট করেছি। আপনার যদি সময় থাকে তবে একবার দেখুন এবং তাও আপনার পক্ষে কাজ করে কিনা তা আমাকে জানান।
টেরডন

ধন্যবাদ তবে প্রথম সমস্যা rxvt -> window 31457282 has no pid associated with it(লুবুন্টুতে পরীক্ষা করা)
টুকসন

উহু? জঘন্য, এটি অদ্ভুত। আমি দারুচিনি অধীনে পরীক্ষা।
টেরডন

উত্তর:


29

মূল সংস্করণ

এটি করার একটি উপায় হ'ল আপনার বর্তমান শেল সেশনের মূল প্রক্রিয়া এবং সেখান থেকে টার্মিনালের নাম।

  1. বর্তমান শেল প্রক্রিয়াটির পিতামাতাকে পান। ব্যাশ ভেরিয়েবলটি $$আপনার বর্তমান শেলের পিআইডি, সুতরাং আমরা এটিকে ps( -p $$) এর কাছে একটি জিজ্ঞাসা হিসাবে দিতে পারি এবং এটি টি টি প্যারেন্ট প্রসেসের পিআইডি প্রিন্ট করতে বলতে পারি ( -o ppid=, পিছনে =কলামের শিরোনামগুলি এড়ানোর জন্য):

    $ ps -p $$ -o ppid=
    544
    

    সুতরাং, আমার শেলের পিতামাতার পিআইডি হ'ল 544

  2. সেই পিআইডির সাথে সম্পর্কিত প্রক্রিয়াটি পান এবং এর কমান্ড লাইনটি মুদ্রণ করুন

    $ 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অন্য ব্যবহারকারীর সাথে পরিচয় করানোর পরে আপনার শেলটি চালাবেন বা যখন আপনার টার্মিনালটি কোনও কিছুর সাথে যুক্ত হয় এবং অন্যান্য বিভিন্ন ক্ষেত্রে এটি চেপে যায় will যেহেতু আমরা স্পষ্টত এখানে এক্স প্রোগ্রামের সাথে কাজ করছি, এর থেকে আরও ভাল উপায় এর পরিবর্তে তথ্য পাওয়ার জন্য xdotool(এর সাথে ইনস্টলযোগ্য sudo apt-get install xdotool) কিছু ব্যবহার করা যেতে পারে :

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

উপরেরগুলি বর্তমানে সক্রিয় উইন্ডোটি চালু করতে ব্যবহৃত কমান্ড লাইনটি মুদ্রণ করবে। যেহেতু আপনার টার্মিনালটি সম্ভবতঃ সক্রিয় থাকবে, এটি হ'ল আদেশটি। এর অর্থ হ'ল বেশিরভাগ টার্মিনাল এমুলেটরগুলির জন্য, আপনি নিরাপদে ধরে নিতে পারেন যে 1 ম ক্ষেত্রটি ফিরে এসেছে টার্মিনালের নাম:

$ which_term 
lxterminal 

এর অর্থ সংস্করণ পাওয়া তুচ্ছ v উদাহরণ স্বরূপ

$ 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"
}

এটি আমি পরীক্ষিত সমস্ত ক্ষেত্রে কাজ করে।


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

@ জুবু-তুর স্ক্রিনশট যুক্ত করবেন না। আপনার প্রশ্নের মধ্যে কেবল ত্রুটি বার্তাটি পেস্ট করুন। মেনু আইটেমটি যেই কমান্ড কমান্ডের জন্য একই। আমার কাছে এটি কোনও ছবি থেকে ম্যানুয়ালি অনুলিপি করার আশা করবেন না!
টেরডন

2
আপনি কেবল $PPIDপিতামাতার প্রক্রিয়াটির পিআইডি পেতে ব্যবহার করতে পারেন।
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)। যদি আপনি কোনও সেশন ব্যবহার করেন তবে তারা সমস্ত ব্যর্থ হবে (যেমন আমার হবে)।
টেরডন

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

$PPIDশেলের পিতা-মাতার প্রক্রিয়ার পিআইডি। কমান্ডcomm মানে । এটি পুরো পথ হতে পারে বা নাও হতে পারে, তাই প্রয়োজনে আমরা পথটি সরিয়ে ফেলার জন্য ব্যবহার করি ।basename

আদেশ সহকারে

এগুলি সম্ভবত কমপক্ষে অন্যান্য উত্তরগুলির ক্ষেত্রেও প্রযোজ্য।

  • commপ্রযুক্তিগতভাবে argv[0], যা আসলে একটি স্বেচ্ছাসেবী স্ট্রিং হতে পারে। তবে সাধারণভাবে, আপনার এই বিশেষ ক্ষেত্রে এটির উপর নির্ভর করতে সক্ষম হওয়া উচিত।

  • আপনি এসএসএইচ বা ব্যবহার tmux, screenবা অনুরূপ কিছু সংযোগ স্থাপনের ফলে এটি প্রত্যাশার মতো কাজ করবে না ।


এটি খুব সুন্দর +1, তবে টার্মিনেটর টার্মিনালে আমি কেবল terminআউটপুট হিসাবে পাই ।
টুকসন

কেন জানি না, সম্ভবত এটি টার্মিনেটরের দোষ।
nyuszika7h

এটি কারণ এটি আমার মনে হয় অজগর লিপি হিসাবে চালিত হয়েছে। এটা সত্যিই বিরক্তিকর.
টেরডন

দয়া করে মনে রাখবেন যে $PPIDসমস্ত শেলের মধ্যে এটি স্ট্যান্ডার্ড নয়। যেমন tcshআমি পেয়েছি:PPID: Undefined variable.
আরিফেল

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

আমি মনে করি তিনি এটি সক্রিয় টার্মিনাল সেশনের জন্য জানতে চান :) সুতরাং যদি সে "পট্টি" ব্যবহার করে সে সময় ...
রিনজউইন্ড

"পুট্টি" ওভার নয় তবে এক্সটার্ম সম্পর্কে কী, এই কমান্ডটি দিয়ে আমি gnome-terminal 3.6.2-0ubuntu1lএক্সটার্মেও পেতে পারি?
টুকসন

2
আপনি এই মুহুর্তে ব্যবহার করছেন টার্মিনালটি এটি মুদ্রণ করে না। এটি ডিফল্ট OL রঙিন যা সেট করা হয়েছে তা মুদ্রণ করে, আপনি যে সময়ে ব্যবহার করছেন তার সাথে এর কোনও যোগসূত্র নেই।
টেরডন

আপডেটটি এক্সটার্মের সাথেও ভালভাবে কাজ করে এবং সংস্করণ এবং নামটি দেখায়।
টুকসন

সমস্ত কৃতিত্ব @ অ্যাভিনাস এবং আপনার কাছে সঠিক কমান্ডের জন্য। আমি সবেমাত্র সংস্করণ যুক্ত করেছি।
সিলভাইন পাইনাউ

2

আর একটি (নিখুঁত নয়) সম্ভাবনা:

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

তবে এটি lxterminal নিয়ে কাজ করে না কারণ পরিবেশের পরিবর্তনশীল $WINDOWIDখালি রয়েছে ...

টার্মিনেটর "এক্স-টার্মিনাল-এমুলেটর" নামটি দেখায়।


0

বর্তমান টার্মিনালটি একটি পালানোর ক্রমের মাধ্যমেও সনাক্ত করা যায়: ডিভাইস অ্যাট্রিবিউটস (মাধ্যমিক ডিএ)

বাশ উদাহরণস্বরূপ:

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

এটি কেবল একধরণের আইডি ফেরত দেয় - এবং দুঃখের সাথে আমি এমন কোনও অফিসিয়াল তালিকা জানি না যা এগুলি প্রকৃত নামের সাথে অনুবাদ করে।


সত্যিকারের বাস্তবায়নের জন্য, এটি টার্মিনালের নামের সাথে কিছু পরিচিত আইডির অনুবাদ করে, এই উদাহরণটি দেখুন বাশ স্ক্রিপ্ট: https://github.com/mintty/utils/blob/master/terminal

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