Hangi terminali kullandığımı nasıl kontrol edebilirim?


23

Makinemde Ubuntu var ve bunun üzerine harika bir pencere yöneticisi çalıştırıyorum. Hangi terminali çalıştırdığımı nasıl kontrol edebilirim? Bunun için bir komut var mı?


5
Ne demek istiyorsunuz ki ? Click Yardım -> Hakkında öyle mi?
JoKeR

3
Terminal programı veya kabuğu hangi terminali ifade eder?
heemayl

Yanıtlar:


24

TL; DR

  • şu anda çalışan kabuk kullanımını bulmak için ls -l /proc/$$/exe
  • Çalışmakta olan terminali bulmak için kullanın xprop _NET_WM_PID WM_CLASS. Daha pidsonra değeri ps -p <pid> -o argskomuta geçebilir .
  • Teknik olarak, terminal emülatörü için açıklamalarda belirtildiği gibi bir komuta bile ihtiyacınız yok :

    Ne demek istiyorsun? Yardım -> Hakkında mı? - JoKeR

Kabuk vs Terminal

Açıklığa kavuşturmamız gereken ilk şey, tam olarak ne istendiğidir - çalışan kabuğu veya çalışan terminali bulun. Genellikle bu iki terim birbirinin yerine kullanılır, ancak bunlar tamamen farklı şeylerdir. Kabuk komut satırı yorumlayıcısıdır, özellikle etkileşimli kabuk komutları girdiğiniz komut istemi artı metin alanıdır. Kabuklar etkileşimli olmayabilir, örneğin bir komut dosyası etkileşimli olmayan kabuğu bash -c 'echo hello world'başlatır veya etkileşimli olmayan kabuğu başlatır.

Aksine, terminal kabuğa arayüzdür (yine de başka bir uygulama da olabilir). Başlangıçta terminal gerçek donanıma atıfta bulundu, ancak bugünlerde çoğunlukla yazılım. GUI'deki Ctrl+ Alt+ tuşlarına bastığınızda tveya terminal simgesine tıkladığınızda, bir terminal emülatörü, donanımın davranışını taklit eden bir pencere başlatır ve bu pencerede kabuğun çalıştığını görebilirsiniz. Ctrl+ Alt+ F2(veya 6 işlev tuşundan herhangi biri) sanal konsolu, aka açacaktır tty. Okumayı öneririm Neden sanal bir terminal "sanal" ve "gerçek" terminal neyin / niçin / nerede? özellikleri hakkında daha fazla bilgi için.

Kabuk bilgisini almak

Her kullanıcının /etc/passwdkendi kullanıcı adı için kendisine atanmış varsayılan bir kabuğu vardır . Varsayılan yapılandırma kullandığınızı ve açıkça bir komut olarak başka bir kabuk çağırmadığınızı varsayalım:

echo $SHELL

Fakat elbette bu sadece varsayılan değeri gösterir . Aşağıdakileri yaptığımızı varsayalım:

user@ubuntu:~$ dash
$

Biz başlangıçta vardı bash, ama etkileşimli oturumu başladı /bin/dash, Ubuntu'nun POSIX veya sistem kabuğu . Değişken $SHELLdeğişmez, çünkü amacı bu değil - varsayılan değeri değil mevcut değeri gösterir. Buna başka bir perspektiften yaklaşmamız gerekecek - içinde ele aldığım şey olan sürecin perspektifi bash veya sh kullanıyor muyum?

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

Burada /proc/dosya sisteminden faydalanıyoruz . İşlemin adı ve komut satırı parametreleri içinde gösterilir /proc/<pid>/comm. Tek ihtiyacımız olan, kabuğun PID'sini sağlamak $$. Yukarıdaki örnekte, bunu ayrı olarak ekliyorum, fakat bizi sadece yapmaktan alıkoyacak hiçbir şey yok.

cat /proc/$$/comm

Temadaki çeşitlilik de olabilir.

ps -p $$ -o args

Buna yaklaşabilmemizin bir başka yolu da nerede olduğunu kontrol etmek /proc/<pid>/exe. Bu dosya çalıştırılabilir dosyaya işaret eden bir bağlantıdır. Böylece yapabiliriz

user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1255/exe -> /bin/dash

İki yaklaşımdan biri vakaların% 99'unda işe yarıyor. Tabii ki, onların yıkılmalarının yolları var. Örneğin, symlink, çalıştırılabilir kabuk başlatıldıktan kısa bir süre sonra silinirse hiçbir yere işaret etmez (ve bu durumda muhtemelen, sistem komutlarıyla karşılaşırsınız, çünkü bunları kaldırmanız /bin/sh, /bin/dashhatta /bin/bashönerilmemeniz - çoğu komut dosyası bunlara dayanır) , özellikle sistem düzeyinde olanlar). Kabuk için komut adı genellikle execve()syscall'deki ilk argüman olarak ayarlanır . Bu, bash'ın nasıl kullanıldığını nasıl biliyor? , Bir kabuk aracılığıyla başlatan bir uygulamanız varsa execve(), herhangi bir isim verebilir. Ancak bunlar standart olmayan ve tipik olmayan şeylerdir, tutarlılık ve güvenlik açısından kaçınılması gerekenler.


Terminal Bilgilerini Alma

Çevre değişkenleriyle başlayabiliriz. Birçok terminal kendilerini veya xtermtarafından bildirilen uyumlu olarak maskeliyor gibi görünmektedir . Ancak o zaman çevre değişkenleri çok güvenilir bir araç değildir. Ayarlanabilir ve ayarlanamazlar. Aynı şeyi PID'lerle de tekrar yapabiliriz, ancak bu sefer ebeveyn PID'e bakacağız. Hatırlayabileceğiniz gibi, terminal kabuğun arayüzüdür ve sıklıkla kabuğun kendisini başlatır. Bu nedenle, kabuğumuzun ana işleminin hangi işlem olduğunu öğrenebiliriz:echo $TERMecho $COLORTERM

$ ps -p $$ -o args,ppid
COMMAND                      PPID
bash                         1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server

Başka bir terminal uygulamasıyla deneyelim sakura:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
/bin/bash                   16950
$ ps -p 16950 -o args
COMMAND
sakura

Oradan, bu kabuğun neyin başladığını zaten görebiliyoruz gnome-terminal. Elbette bu yöntem, etkileşimli kabuk ile çalıştığınızı varsayıyor. Örneğin, üst öğenin ebeveyni bash -c '...'veya kabuğunu bulmaya çalışıyorsak ssh, PID, terminal olmayan bir uygulamadan ve belki de GUI dışı olabilir.

Öyleyse, GUI terminali ile özel olarak ilgilenmek istiyorsak, yapabileceğimiz şey çalıştırılır xprop, istenen pencereye tıklayın, iadesini alın ve bu işlemin eşleştirme işleminin adının ne olduğunu bulun. Veya başka bir deyişle:

$ ps aux | grep $(xprop | awk -F'='  '/PID/ {print $2}')                       
xieerqi   2124  0.6  1.7 208068 34604 ?        Sl   18:47   1:49 gnome-terminal

Ek olarak, spesifikasyonlara göre , pencere yöneticileri WM_CLASSözelliği belirlemelidir . Böylece bunu da alabiliriz xprop:

$ xprop WM_CLASS 
WM_CLASS(STRING) = "sakura", "Sakura"

Tabii ki, bu aynı zamanda% 1 dezavantajına sahiptir: ayarlama WM_CLASSözellikleri bunu yapan pencere yöneticisine dayanır ve karmaşık bir hata ayıklamayı içerebilecek bir pencerenin doğru olması için PID'nin garantisi yoktur (bkz. Bu X11 penceresini hangi süreç oluşturdu? ). Bunlar, yöntemlerin kendisinde değil, X11 sunucusunda eksiklikler değil. Bununla birlikte, çoğu kararlı ve iyi bilinen pencere yöneticileri (openbox, Metacity, blackbox gibi) ve çoğu uygulama iyi davrandığından, Gnome Terminal veya Terminator gibi bir şeyle ilgili sorunlar beklememeliyiz.

Fakat GUI terminal emülatörlerine gelince, bir komut bulmamız bile gerekmiyor. Sadece Aboutpencerenin kendi diyalog penceresini kullanabiliriz . Bu kuralın istisnası xterm.


O_o $SHELL, elbette
AB

Eek. Siz insanlar neden kullanıyorsunuz ps | grep? ps -p $$! Veya, sadece komut için ps -p $$ -o cmd=.
muru

@muru, çünkü sizden daha az tecrübeli bir kullanıcıyım ve ezberlenen tüm ps bayraklarına sahip değilim> _ <künt
Sergiy Kolodyazhnyy

2
Ben de yapmam, ama ps | grepsadece kötü bir form. Elde edebileceğinizlerin çoğu, aslında pskendiliğinden veya başka araçlarla elde edilebilir.
muru

NOT: Bu soru genel olarak belirsiz olduğu ve bazı kısımlarının arka plan gerektirdiği için cevabımı güncelledim; zamanla ben de komutları çağırmak için daha iyi yollar olduğunu öğrendim.
Sergiy Kolodyazhnyy

12

Kısa versiyon (thx @Serg )

cat /etc/alternatives/x-terminal-emulator

Uzun versiyon

sudo update-alternatives --config x-terminal-emulator

ve *çıktıda arayın

;)


Örnek çıktı

There are 7 alternatives which provide `x-terminal-emulator’.
Seçim Alternatifleri
----------------
    1 / usr / bin / xterm
    2 / usr / bin / uxterm
    3 / usr / bin / koi8rxterm
    4 / usr / bin / lxterm
 * + 5 / usr/bin/gnome-terminal.wrapper
    6 / usr / bin / konsole
    7 / usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:

Veya, @muru sayesinde , burada daha ayrıntılı çıktı

$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
  link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.

2
cat /etc/alternatives/x-terminal-emulator | grep exec
Sergiy Kolodyazhnyy

Yüklemem gereken bir yardımcı program var mı? Ben de almak Binary file (standard input) matchesveya update-alternatives: error: unknown argument -config'`
Terrance

Boş ver, öyle--config
Terrance

1
İhtiyacın yok sudo. Kullanınupdate-alternatives --display x-terminal-emulator
muru

Kısa versiyon file /etc/alternatives/x-terminal-emulatoriçin cat, onu kullanmak yerine bu sembolik bağın hedefini almak için kullanmayı düşünebilirsiniz . Yardımcı fileprogram çoğu sistemde yüklü olmalıdır ve hedef yürütülebilir dosyayı bulmak için kullanılabilir. catsembolik bağlantı, bu bağlantının hedefine bağlı olarak herhangi bir kabuk komut dosyasını veya hatta ikili dosyayı yazdırabilir (kabuk komut dosyası gnome-terminal, ikili dosya urxvt, vb.).
chris544

9

Kullanmakta olduğunuz terminal programını bilmek istiyorsanız, şunu kullanın:

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

Başka bir kabuk örneğini oluşturmadan terminali (kabuk) açtıktan hemen sonra bunu çalıştırın .

Terminal programını açtığınızda, temel olarak bir çocuk programı olan bir kabuk ortaya çıkar. Yani doğmuş kabuğun ebeveyni terminalin kendisidir. Başka bir deyişle, kabuğun PPID'si, terminal programın PID'sidir.

Burada , terminal programın işlem kimliği olacak olan kabuğun ( bash) üst işlem kimliğini (PPID) buluyoruz ps -o 'ppid=' -p $$.

O zaman PID'den proses ismini buluyoruz:

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

Temel olarak şunlardan biri:

$ ps -o 'ppid=' -p $$
 2268

$ ps -o 'cmd=' -p 2268
gnome-terminal

1
Bu komutu çalıştırdığımda anlıyorum sshd: username@pts/4. Not Makineye bağlanmak için PuTTY kullanıyorum. Mı sshdaslında terminal emülatörü?
kullanıcı3731622

3

Yazın printenvaçık oturumun tüm değişkenleri görüntülemek için terminal penceresinden.

Yazın echo $COLORTERMterminal penceresinden. NOT: Bu tüm terminallerde sakuraçalışmaz , bir tanesi bunu geri bildirmez.

root@terrance-Linux:~# echo $COLORTERM
gnome-terminal

Aşağıdaki bir atermterminalden.

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm

echo $ COLORTERM sakura raporları boş
Sergiy Kolodyazhnyy

@Serg teşekkür ederim. O zaman bir xterm çeşidi gibi görünüyor.
Terrance

@Serg sadece Sakura sever misin merak ediyorum? Ve seni buna çeken ne?
Terrance

Tamam, özel bir şey değil, oldukça basit. Çeşitli terminal emülatörlerini denedim: terminatör, roxterm, tilde, dropdown olanı (ne dediğini unuttu, R ile başlayan bir şey). Sanırım xterm ve gnome-terminal arasında bir uzlaşma var
Sergiy Kolodyazhnyy

@Serg Ah, bunu bilmek güzel. Bunu kontrol edeceğim. :-) Ben her zaman xdotool anahtarlarını kendilerine gönderen ve sürekli betiğimle çalışan iyi bir terminal aramaya çıkarım.
Terrance

3

Terminal programının sadece adını istiyorsanız, büyük olasılıkla Yardım> Hakkında altında bulacaksınız.


0
cat /etc/alternatives/x-terminal-emulator | grep exec

Örnek çıktı:

exec ( 'gnome-terminal', @ bağımsız değişken);

Sistemimin cevabı var: GNOME terminali .

Bu yüzden, gnome-terminalterminalime yazmak şimdi aynı bir terminal penceresini açacak.

Kaynaklar:


-1

Basit cevap Hem konsol hem de ssh için çalışır.

Basit karakter terminali için örnek:

ssh username@systemname
echo $TERM
dumb

bu bağlantıda GUI uygulamalarını açamayacağınızı söylüyor

Xterm örneği (Windows'ta PuTTY / Xming ile de çalışır)

ssh -Y username@systemname      -- omit this if using PuTTY --
echo $TERM
xterm

Leafpad düzenleyiciyi veya nautilus dosya yöneticisini açmak gibi GUI komutlarını kullanabileceğiniz anlamına gelir.

Konsolda aynı:

Open terminal window
echo $TERM
xterm

TERMvarsayılan terminal emülatörünü tanımlayan bir değişken değil, mevcut olanın özelliklerini tanımlayan bir değişkendir. Örneğin, değişkeni "xterm-color" olarak ayarlamak, terminalde çalışan tüm programların mevcut terminalin renkleri anlaması gerektiğini bilmesini sağlar; onu "linux" a ayarlamak programlara bunun bir VT olması gerektiğini söyler; vs.
Cybolic
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.