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ı?
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ı?
Yanıtlar:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Daha pid
sonra değeri ps -p <pid> -o args
komuta 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
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.
Her kullanıcının /etc/passwd
kendi 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 $SHELL
değ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/dash
hatta /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.
Çevre değişkenleriyle başlayabiliriz. Birçok terminal kendilerini veya xterm
tarafı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 $TERM
echo $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 About
pencerenin kendi diyalog penceresini kullanabiliriz . Bu kuralın istisnası xterm
.
$SHELL
, elbette
ps | grep
? ps -p $$
! Veya, sadece komut için ps -p $$ -o cmd=
.
ps | grep
sadece kötü bir form. Elde edebileceğinizlerin çoğu, aslında ps
kendiliğinden veya başka araçlarla elde edilebilir.
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'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
veya update-alternatives: error: unknown argument
-config'`
--config
sudo
. Kullanınupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
için cat
, onu kullanmak yerine bu sembolik bağın hedefini almak için kullanmayı düşünebilirsiniz . Yardımcı file
program çoğu sistemde yüklü olmalıdır ve hedef yürütülebilir dosyayı bulmak için kullanılabilir. cat
sembolik 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.).
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
sshd: username@pts/4
. Not Makineye bağlanmak için PuTTY kullanıyorum. Mı sshd
aslında terminal emülatörü?
Yazın printenv
açık oturumun tüm değişkenleri görüntülemek için terminal penceresinden.
Yazın echo $COLORTERM
terminal 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 aterm
terminalden.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
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-terminal
terminalime yazmak şimdi aynı bir terminal penceresini açacak.
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
TERM
varsayı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.