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?
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?
Jawaban:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Nilai pid
nanti bisa diteruskan ke ps -p <pid> -o args
perintah.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
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.
Setiap pengguna memiliki shell default yang ditetapkan /etc/passwd
untuk 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 $SHELL
tidak 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/dash
atau bahkan /bin/bash
tidak 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.
Kita bisa mulai dengan variabel lingkungan. Banyak terminal tampaknya menutupi diri mereka sebagai xterm
-compatible, yang dilaporkan oleh echo $TERM
atau 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_CLASS
properti. Jadi, kita juga bisa mendapatkannya dari xprop
:
$ xprop WM_CLASS
WM_CLASS(STRING) = "sakura", "Sakura"
Tentu saja, ini juga memiliki 1% kelemahannya: WM_CLASS
properti 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 About
dialog dari jendela itu sendiri. Pengecualian terhadap aturan itu adalah xterm
.
$SHELL
, tentu
ps | grep
? ps -p $$
! Atau, hanya untuk perintah ps -p $$ -o cmd=
,.
ps | grep
hanya bentuk yang buruk. Sebagian besar dari apa yang Anda dapat grep, sebenarnya dapat diperoleh dengan ps
sendirinya, atau dengan alat lain.
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'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
atau update-alternatives: error: unknown argument
–config'`
--config
sudo
. Gunakanupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
untuk menggunakan target tautan simbolis ini daripada menggunakannya cat
. The file
utilitas harus diinstal pada kebanyakan sistem dan dapat digunakan untuk mencari executable sasaran. cat
pada tautan simbolik dapat mencetak skrip shell atau bahkan file biner tergantung pada target tautan ini (skrip shell untuk gnome-terminal
, file biner urxvt
, dll.).
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
sshd: username@pts/4
. Catatan Saya menggunakan Putty untuk terhubung ke mesin. Apakah sshd
sebenarnya emulator terminal?
Ketik printenv
dari jendela terminal untuk melihat semua variabel sesi terbuka.
Ketik echo $COLORTERM
dari jendela terminal. CATATAN: ini tidak bekerja dengan semua terminal, terminal seperti sakura
tidak melaporkan ini kembali.
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
yang di bawah ini dari aterm
terminal.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
Jika Anda hanya ingin nama program terminal, kemungkinan besar Anda akan menemukannya di Bantuan> Tentang.
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-terminal
terminal saya sekarang akan membuka jendela terminal identik lainnya.
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
TERM
bukan 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.