Geçerli terminalin adını komut satırından nasıl alabilirim?


25

Terminal tipini komut ile alma imkanı var mı?

Kullanıyorsam gnome-terminalçıktı gnome-terminalveya benzeri bir şey olmalı . Terminalin versiyonunu görmek de iyi olurdu.

Güncelleştirme

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

şöyle bir şey çıkacak:

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

Bu aynı zamanda xterm ile de çalışacaktır, ancak sadece adı nasıl alabilirim ( xfce4-terminalbu durumda)?


Daha yeni ve daha iyi bir yaklaşımla cevabımı güncelledim. Zamanınız varsa, bir göz atın ve sizin için de işe yarayıp yaramadığını bana bildirin.
terdon

Teşekkürler ama rxvt -> window 31457282 has no pid associated with it(
Lubuntu'da

Ah? Kahretsin, bu garip. Tarçın altında test ettim.
terdon

Yanıtlar:


29

Orijinal versiyon

Bunu yapmanın bir yolu, mevcut kabuk oturumunuzun ana işlemini ve oradan terminalin adını almaktır.

  1. Geçerli kabuk sürecinin üstünü al. Bash değişkeni $$, mevcut kabuğunuzun PID değeridir, bu yüzden bunu bir sorgu olarak ps( -p $$) verebiliriz ve üst işlemin PID'sini yazdırmasını isteyebiliriz ( -o ppid=takip eden =sütun başlıklarının yazdırılmasını önlemektir):

    $ ps -p $$ -o ppid=
    544
    

    Yani, benim kabuğumun ebeveyninin PID olduğunu 544.

  2. Bu PID ile ilişkili süreci alın ve komut satırını yazdırın

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

    Yukarıdaki çıktı, kullandığınız terminal emülatörüne bağlı olarak değişecektir terminator.

  3. Her şeyi tek bir komutta birleştir

    ps -p $(ps -p $$ -o ppid=) o args=
    
  4. Sürümü almak için bunu kullanın.

    $(ps -p $(ps -p $$ -o ppid=) o args=) --version
    terminator 0.97
    
  5. ~/.bashrcKullanmakta olduğunuz terminal emülatörünün adını ve versiyonunu döndüren küçük bir fonksiyon ekleyin (bu, en yaygın terminal emülatörleri için geçerlidir):

    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}')    
    }

    Artık terminalin adını alabilir ve istediğiniz herhangi bir seçeneği de iletebilirsiniz (örneğin --version.

Farklı terminalleri kullanan bazı örnekler:

  1. xterm

    $ which_term
    XTerm(297)
    
  2. terminator

    $ which_term 
    terminator 0.97
    
  3. rxvtBu bir hiçbiri yoktur -V, -versionya da --versionhiçbir sürüm bilgisi basılır, böylece bayraklar.

    $  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/>.
    

Yeni ve geliştirilmiş

Yukarıdaki yaklaşım bu kadar güvenilir değildir. Kabuğunuzu subaşka bir kullanıcıya girdikten sonra çalıştırdığınızda veya terminaliniz bir şey ve diğer çeşitli durumlara takılı kaldığında boğulacaktır. Açıkçası burada X programlarıyla çalıştığımız için, bunun yerine bilgiyi almak için benzer bir şey kullanmak xdotool(kurulum yapılabilir sudo apt-get install xdotool) kullanmak olabilir :

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

Yukarıdakiler, aktif pencereyi başlatmak için kullanılan komut satırını basacaktır. Terminaliniz muhtemelen aktif olacağından, göstereceği komut bu olacaktır. Bu, çoğu terminal öykünücüsü için, döndürülen 1. alanın terminal adı olduğunu güvenli bir şekilde kabul edebileceğiniz anlamına gelir:

$ which_term 
lxterminal 

Bu, sürüm almanın önemsiz olduğu anlamına gelir. Örneğin

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

Öyle değil gnome-terminal:

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

veya terminator:

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

Böylece biraz daha karmaşık hale getirebiliriz (burada bazı temel bilgiler var, bu taşınabilir değil):

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

Bu, test ettiğim tüm durumlar için çalışıyor.


@ Xubu-Tur hmm, sadece her bir terminali manuel olarak başka bir terminalden başlatarak denedim ve iyi çalıştı. Masaüstü ortam menülerinizin farklı bir yolu olduğunu veya terminalleri nasıl başlattıklarına göre bir şekilde farklı olduğunu tahmin ediyorum. Bana onları tam olarak nasıl başlattığınızı ve hangi hatayı aldığınızı söylerseniz, size daha iyi bir şeyler verebilirim. Bir menüden başlattıysanız, menü öğesinin hangi komutu çalıştırdığını kontrol edin.
terdon

@ Xubu-Tur ekran görüntüsü eklemiyor. Sadece hata mesajını sorunuza yapıştırın. Menü öğesinin başlattığı komut için aynıdır. Bir resimden elle kopyalamamı beklemeyin!
terdon

2
Yalnızca $PPIDüst işlemin PID'sini almak için kullanabilirsiniz .
nyuszika7h

@ nyuszika7h evet yapabilirsiniz ve bunun için +1 ama ben istemem. Sadece kontrol ve kullanılabilir değil kshya tcsh. Benim yaklaşımımdan çok daha basit olduğu için bash ailesi için çok iyi bir fikir.
terdon

Bu ksh93ve kesinlikle kullanılabilir mksh.
nyuszika7h

8

Bunu dene,

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

VEYA

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

İlk başarısız rxvtve terminatorikinci başarısız uxtermve gnome-terminal(yazdırır /usr/lib/gnome-terminal/gnome-terminal-server). Bir su seansı kullanıyorsanız, hepsi başarısız olacak (benim olacak).
terdon

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

$PPIDkabuğun ana işleminin PID'sidir. komutcomm anlamına gelir . Tam bir yol olabilir veya olmayabilir, bu yüzden gerekirse yolu soymak için kullanırız .basename

Uyarılar

Bunlar muhtemelen diğer cevapların en azından bir kısmı için de geçerli.

  • commteknik olarak argv[0], aslında rastgele bir dize olabilir. Ancak genel olarak, bu özel durum için buna güvenebilmelisiniz.

  • Bu SSH veya kullanımını üzerine bağlarsanız beklendiği gibi çalışma olmaz tmux, screenya da benzer bir şey.


Bu çok güzel +1, ancak sonlandırıcı terminalinde sadece terminçıktı olarak alıyorum.
TuKsn

Nedenini bilmiyorum, muhtemelen Terminator’ün suçu.
nyuszika7h

Çünkü bence bir python betiği olarak çalıştırılıyor. Bu gerçekten sinir bozucu.
terdon

Lütfen $PPIDtüm kabuklarda standart olmadığını unutmayın . örneğin tcshalıyorum:PPID: Undefined variable.
arielf

2

Aşağıdaki komutu deneyebilirsiniz:

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

Güncelleme (OP ve Avinash Raj sayesinde):

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

Sanırım aktif terminal oturumu için bunu bilmek istiyor :) Yani o zaman "macun" kullanıyorsa ...
Rinzwind

"Macun" üzerine değil ama xterm hakkında ne, bu komut ile de gnome-terminal 3.6.2-0ubuntu1lxterm olsun ?
TuKsn

2
Bu, şu anda kullandığınız terminali yazdırmaz. Varsayılan olarak ayarlanmış olanı yazdırır $ COLORTERM, o sırada kullandıklarınızla ilgisi yok.
terdon

Güncelleme, xterm ile de iyi çalışır ve sürümü ve adını gösterir.
TuKsn

Tüm kredi @ Avinash ve doğru komut için size gidiyor. Sadece sürümü ekledim.
Sylvain Pineau

2

Bir başka (mükemmel değil) olasılık:

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

Fakat bu, lxterminal ile çalışmıyor çünkü $WINDOWIDboş ortam değişkeni var ...

Sonlandırıcı, "x-terminal-emulator" adını gösterir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.