Bagaimana saya memeriksa terminal mana yang saya gunakan?


23

Saya memiliki Ubuntu di mesin saya dan saya menjalankan window manager yang luar biasa di atasnya. Bagaimana saya memeriksa terminal mana yang saya jalankan? Apakah ada perintah untuk itu?


5
apa yang Anda maksud dengan yang ? Klik Bantuan -> Tentang apakah itu?
JoKeR

3
Terminal mana yang berarti program terminal atau shell?
heemayl

Jawaban:


24

TL; DR

  • untuk menemukan penggunaan shell yang sedang berjalan ls -l /proc/$$/exe
  • untuk menemukan terminal yang sedang berjalan, gunakan xprop _NET_WM_PID WM_CLASS. Nilai pidnanti bisa diteruskan ke ps -p <pid> -o argsperintah.
  • Secara teknis, untuk emulator terminal Anda bahkan tidak memerlukan perintah, seperti yang dinyatakan dalam komentar :

    apa maksudmu dengan itu Klik Bantuan -> Tentang apakah itu? - JoKeR

Shell vs Terminal

Hal pertama yang perlu kita perjelas adalah apa yang sebenarnya ditanyakan - cari tahu shell yang menjalankan atau terminal yang sedang berjalan. Seringkali kedua istilah ini digunakan secara bergantian, tetapi semuanya berbeda. Shell adalah interpreter baris perintah, khususnya shell interaktif adalah kolom teks plus prompt tempat Anda memasukkan perintah. Kerang juga bisa non-interaktif, misalnya skrip memulai non-interaktif, atau bash -c 'echo hello world'juga memulai non-interaktif.

Sebaliknya, terminal adalah antarmuka untuk shell (meskipun bisa jadi aplikasi lain juga). Awalnya terminal mengacu pada perangkat keras yang sebenarnya, tetapi saat ini kebanyakan perangkat lunak. Apa yang Anda lihat ketika Anda menekan Ctrl+ Alt+ tatau mengklik ikon terminal di GUI, yang memulai emulator terminal, jendela yang meniru perilaku perangkat keras, dan di dalam jendela itu Anda dapat melihat shell berjalan. Ctrl+ Alt+ F2(atau salah satu dari 6 tombol fungsi) akan membuka konsol virtual, alias tty. Saya sarankan membaca Mengapa terminal virtual "virtual", dan apa / mengapa / di mana terminal "nyata"? untuk info lebih lanjut tentang spesifikasi.

Mendapatkan informasi shell

Setiap pengguna memiliki shell default yang ditetapkan /etc/passwduntuk nama pengguna mereka. Dengan asumsi Anda menggunakan konfigurasi default dan belum memanggil shell lain secara eksplisit sebagai perintah, itu sudah cukup untuk dilakukan:

echo $SHELL

Tetapi tentu saja ini hanya menunjukkan nilai default . Misalkan kita melakukan hal berikut:

user@ubuntu:~$ dash
$

Kami awalnya masuk bash, tetapi memulai sesi interaktif /bin/dash, POSIX Ubuntu atau shell sistem . Variabel $SHELLtidak akan berubah, karena itu bukan tujuannya - ini menunjukkan default bukan nilai saat ini. Kita perlu mendekati ini dari perspektif lain - perspektif suatu proses, yang merupakan sesuatu yang telah saya bahas Apakah saya menggunakan bash atau sh?

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

Di sini kita mengambil keuntungan dari /proc/sistem file. Nama parameter proses dan baris perintah ditampilkan di /proc/<pid>/comm. Yang kita butuhkan adalah memberikan PID shell, yang memang $$bisa. Dalam contoh di atas saya menambahkan secara terpisah, tetapi tidak ada yang menghentikan kita dari melakukan hal yang adil

cat /proc/$$/comm

Variasi pada tema juga bisa

ps -p $$ -o args

Cara lain kita bisa mendekati ini adalah melalui memeriksa di mana /proc/<pid>/exe. File ini adalah symlink yang menunjuk ke file yang dapat dieksekusi. Demikian yang bisa kita lakukan

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

Salah satu dari dua pendekatan tersebut bekerja pada 99% kasus. Tentu saja, ada cara di mana mereka dapat ditumbangkan. Misalnya, symlink tidak akan menunjuk di mana saja jika eksekusi telah dihapus tak lama setelah shell dimulai (dan dalam hal ini Anda mungkin akan mengalami masalah sistem, karena menghapus /bin/sh, /bin/dashatau bahkan /bin/bashtidak dianjurkan - setelah semua banyak script bergantung pada mereka , terutama yang tingkat sistem). Nama perintah untuk shell biasanya ditetapkan sebagai argumen pertama di execve()syscall. Ini tercakup dalam Bagaimana bash tahu bagaimana itu dipanggil? , jadi jika Anda memiliki aplikasi yang meluncurkan shell via execve(), itu bisa memberikan nama apa pun. Tetapi ini adalah hal-hal yang tidak standar dan tidak tipikal, yang harus dihindari demi konsistensi dan keamanan.


Mendapatkan Informasi Terminal

Kita bisa mulai dengan variabel lingkungan. Banyak terminal tampaknya menutupi diri mereka sebagai xterm-compatible, yang dilaporkan oleh echo $TERMatau echo $COLORTERM. Tetapi variabel lingkungan bukanlah alat yang sangat andal. Mereka dapat diatur dan tidak disetel. Kita dapat melakukan hal yang sama dengan PID lagi, kecuali kali ini kita akan melihat PID induk. Seperti yang mungkin Anda ingat, terminal adalah antarmuka ke shell dan sering memulai shell itu sendiri. Oleh karena itu kita dapat mengetahui proses apa yang merupakan proses induk dari shell kita:

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

Coba Mari dengan aplikasi terminal lain, sakura:

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

Dari sana kita sudah bisa melihat apa yang memulai shell ini gnome-terminal. Metode ini tentu saja bekerja dengan asumsi Anda bekerja dengan shell interaktif. Jika kami mencoba mengetahui induk bash -c '...'atau shell yang memulai ssh, misalnya, PID mungkin berasal dari aplikasi non-terminal dan mungkin juga bukan GUI.

Jadi jika kita ingin secara khusus berurusan dengan terminal GUI, yang bisa kita lakukan adalah menjalankan xprop, klik pada jendela yang diinginkan, ambil pidnya, dan cari tahu apa nama proses yang cocok dengan pid itu. Atau dengan kata lain:

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

Selain itu, sesuai spesifikasi , manajer jendela harus menetapkan WM_CLASSproperti. Jadi, kita juga bisa mendapatkannya dari xprop:

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

Tentu saja, ini juga memiliki 1% kelemahannya: WM_CLASSproperti pengaturan bergantung pada manajer jendela yang melakukan hal itu, dan PID tidak dijamin untuk sebuah jendela menjadi akurat (lihat Proses apa yang membuat jendela X11 ini? ), Yang mungkin melibatkan debugging yang rumit. Dan ini bukan kekurangan dari metode itu sendiri tetapi dari server X11. Namun, pengelola jendela yang paling stabil dan terkenal (seperti openbox, Metacity, blackbox) dan sebagian besar aplikasi berperilaku baik sehingga kita seharusnya tidak mengharapkan masalah dengan sesuatu seperti Gnome Terminal atau Terminator.

Tetapi ketika datang ke emulator terminal GUI, kita bahkan tidak perlu menemukan perintah. Kami hanya dapat menggunakan Aboutdialog dari jendela itu sendiri. Pengecualian terhadap aturan itu adalah xterm.


O_o $SHELL, tentu
AB

Eek. Mengapa Anda digunakan orang ps | grep? ps -p $$! Atau, hanya untuk perintah ps -p $$ -o cmd=,.
muru

@muru karena saya pengguna yang kurang berpengalaman daripada Anda, dan saya tidak menghafal semua flag ps> _ <bluntly
Sergiy Kolodyazhnyy

2
Saya juga tidak, tetapi ps | grephanya bentuk yang buruk. Sebagian besar dari apa yang Anda dapat grep, sebenarnya dapat diperoleh dengan pssendirinya, atau dengan alat lain.
muru

CATATAN: Saya telah memperbarui jawaban saya, karena pertanyaan ini secara keseluruhan tidak jelas, dan sebagian darinya memerlukan latar belakang; seiring waktu saya juga menemukan ada cara yang lebih baik untuk menjalankan perintah.
Sergiy Kolodyazhnyy

12

Versi singkat (thx @Serg )

cat /etc/alternatives/x-terminal-emulator

Versi panjang

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

dan cari *di output

;)


Contoh output

There are 7 alternatives which provide `x-terminal-emulator’.
Seleksi Alternatif
———————————————–
    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:

Atau, terima kasih kepada @muru , ini output yang lebih detail

$ 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

Apakah ada utilitas yang perlu saya instal? Saya mendapatkan Binary file (standard input) matchesatau update-alternatives: error: unknown argument –config'`
Terrance

Nevermind, it's--config
Terrance

1
Anda tidak perlu sudo. Gunakanupdate-alternatives --display x-terminal-emulator
muru

Untuk versi singkatnya, Anda mungkin mempertimbangkan file /etc/alternatives/x-terminal-emulatoruntuk menggunakan target tautan simbolis ini daripada menggunakannya cat. The fileutilitas harus diinstal pada kebanyakan sistem dan dapat digunakan untuk mencari executable sasaran. catpada tautan simbolik dapat mencetak skrip shell atau bahkan file biner tergantung pada target tautan ini (skrip shell untuk gnome-terminal, file biner urxvt, dll.).
chris544

9

Jika Anda ingin mengetahui program terminal yang Anda gunakan, gunakan ini:

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

Jalankan ini tepat setelah membuka terminal (shell) tanpa forking contoh shell lebih lanjut .

Ketika Anda membuka program terminal, itu pada dasarnya memunculkan program anak, sebuah shell. Jadi induk dari shell yang dihasilkan adalah terminal itu sendiri. Dengan kata lain, PPID dari shell adalah PID dari program terminal.

Di sini kita menemukan ID proses induk (PPID) dari shell ( bash) oleh ps -o 'ppid=' -p $$, yang akan menjadi ID proses dari program terminal.

Kemudian kami menemukan nama proses dari PID:

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

Ini pada dasarnya adalah satu baris:

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

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

1
Ketika saya menjalankan perintah ini saya dapatkan sshd: username@pts/4. Catatan Saya menggunakan Putty untuk terhubung ke mesin. Apakah sshdsebenarnya emulator terminal?
user3731622

3

Ketik printenvdari jendela terminal untuk melihat semua variabel sesi terbuka.

Ketik echo $COLORTERMdari jendela terminal. CATATAN: ini tidak bekerja dengan semua terminal, terminal seperti sakuratidak melaporkan ini kembali.

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

yang di bawah ini dari atermterminal.

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

echo $ COLORTERM dalam sakura laporan blank
Sergiy Kolodyazhnyy

@Serg, terima kasih. Sepertinya itu adalah varian dari xterm.
Terrance

@Erger bertanya-tanya apakah kamu suka Sakura? Dan apa yang membuat Anda tertarik?
Terrance

Tidak apa-apa, tidak ada yang istimewa, cukup sederhana. Saya sudah mencoba berbagai emulator terminal: terminator, roxterm, tilde, yang dropdown (lupa apa namanya, sesuatu yang dimulai dengan R). Saya kira itu adalah kompromi antara xterm dan terminal-gnome
Sergiy Kolodyazhnyy

@ Ah Ah, itu bagus untuk tahu. Saya akan memeriksanya. :-) Saya selalu mencari terminal bagus yang berfungsi dengan skrip keepalive saya yang mengirimkan kunci xdotool kepada mereka.
Terrance

3

Jika Anda hanya ingin nama program terminal, kemungkinan besar Anda akan menemukannya di Bantuan> Tentang.


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

Output sampel:

exec ('gnome-terminal', @ args);

Ada jawaban untuk sistem saya: gnome-terminal .

Jadi, mengetik di gnome-terminalterminal saya sekarang akan membuka jendela terminal identik lainnya.

Sumber:

  • Komentar Sergiy Kolodyazhnyy di bawah jawaban AB .

-1

Jawaban sederhana Bekerja untuk konsol atau ssh.

Contoh untuk terminal karakter sederhana:

ssh username@systemname
echo $TERM
dumb

memberi tahu Anda bahwa Anda tidak dapat membuka aplikasi GUI pada koneksi itu

Contoh untuk xterm (juga berfungsi dengan Putty / Xming pada Windows)

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

berarti Anda dapat menggunakan perintah GUI seperti membuka editor leafpad atau pengelola file nautilus.

Di konsol itu sama:

Open terminal window
echo $TERM
xterm

TERMbukan variabel yang mendefinisikan emulator terminal default, melainkan variabel yang menentukan kemampuan emulator saat ini. Sebagai contoh, mengatur variabel ke "xterm-color" memungkinkan setiap program yang berjalan di terminal tahu bahwa terminal saat ini seharusnya memahami warna; mengaturnya ke "linux" memberitahu program bahwa ini seharusnya menjadi VT; dll.
Simbolis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.