У мене на моїй машині є Ubuntu, а над цим я працює дивовижний менеджер вікон. Як перевірити, на якому терміналі я працюю? Чи є для нього команда?
У мене на моїй машині є Ubuntu, а над цим я працює дивовижний менеджер вікон. Як перевірити, на якому терміналі я працюю? Чи є для нього команда?
Відповіді:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Значення pid
пізніше може бути передано ps -p <pid> -o args
команді.Технічно для емулятора терміналу вам навіть не потрібна команда, як зазначено в коментарях :
що ти маєш на увазі під чим? Клацніть Довідка -> Про це це? - JoKeR
Перше, що нам потрібно буде уточнити - це, що саме просять - з’ясувати запущену оболонку або запущений термінал. Часто ці два терміни вживаються взаємозамінно, але вони зовсім різні речі. Shell - інтерпретатор командного рядка, зокрема інтерактивна оболонка - це текстове поле підказки плюс, куди ви вводите команди. Оболонки також можуть бути неінтерактивними, наприклад, сценарій запускає неінтерактивну оболонку, а bash -c 'echo hello world'
також запускає неінтерактивну оболонку.
Навпаки, термінал - це інтерфейс до оболонки (хоча це може бути й інша програма). Спочатку термінал стосувався фактичного обладнання, але в наш час вони в основному програмні. Що ви бачите, коли натискаєте Ctrl+ Alt+ tабо клацаєте піктограмою терміналу в графічному інтерфейсі, це запускає емулятор терміналу, вікно, яке імітує поведінку обладнання, і всередині цього вікна ви можете бачити оболонку, що працює. Ctrl+ Alt+ F2(Або будь-який з функціональних клавіш 6) відкриє віртуальну консоль, інакше tty
. Я рекомендую прочитати Чому віртуальний термінал є "віртуальним", а що / чому / де "справжнім" терміналом? для отримання додаткової інформації про особливості.
Кожен користувач має за замовчуванням оболонку, призначену їм /etc/passwd
для свого імені користувача. Якщо припустити, що ви використовуєте конфігурацію за замовчуванням і не викликали явно іншу оболонку як команду, достатньо зробити:
echo $SHELL
Але звичайно це показує лише значення за замовчуванням . Припустимо, ми робимо наступне:
user@ubuntu:~$ dash
$
Ми спочатку були bash
, але розпочали інтерактивну сесію /bin/dash
, POSIX або системну оболонку Ubuntu . Змінна $SHELL
не зміниться, оскільки це не її мета - вона показує значення за замовчуванням, а не поточне значення. До цього нам потрібно буде підходити з іншої точки зору - з точки зору процесу, який я висвітлював у Am I, використовуючи bash або sh?
$ echo $$
4824
$ cat /proc/4824/comm
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash
Тут ми скористаємося /proc/
файловою системою. Назва параметрів процесу та командного рядка відображається у /proc/<pid>/comm
. Все, що нам потрібно, це надати PID оболонки, що і $$
робить. У наведеному вище прикладі я додаю це окремо, але ніщо не заважає нам робити просто
cat /proc/$$/comm
Варіації на тему також можуть бути
ps -p $$ -o args
Ще один спосіб ми можемо підійти до цього, перевіривши, куди /proc/<pid>/exe
. Цей файл є символьним посиланням, яке вказує на виконуваний файл. Таким чином ми можемо зробити
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
Будь-який із двох підходів працює в 99% випадків. Звичайно, є способи, за допомогою яких їх можна зіпсувати. Наприклад, символічна не вказуватиме в будь-якому місці , якщо виконуваний файл був видалений відразу після запуску оболонки (і в цьому випадку ви , ймовірно, виникнуть проблеми системи, так як видалення /bin/sh
, /bin/dash
або навіть /bin/bash
не рекомендується - адже багато сценаріїв покладатися на них , особливо системного рівня). Назва команди для оболонки зазвичай задається як перший аргумент у execve()
syscall. Це висвітлено у розділі Як баш знає, як його викликають? , тож якщо у вас є програма, яка запускає оболонку через execve()
, вона може дати їй будь-яку назву. Але це нестандартні та нетипові речі, яких слід уникати заради послідовності та безпеки.
Ми можемо почати зі змінних середовищ. Здається, багато термінали маскують себе як xterm
-сумісні, про що повідомляє echo $TERM
або echo $COLORTERM
. Але тоді змінні середовища - не дуже надійний інструмент. Їх можна встановити і відключити. Ми можемо повторити те ж саме з PID, за винятком цього разу, ми не будемо розглядати батьківський PID. Як ви пам'ятаєте, термінал є інтерфейсом до оболонки і часто запускає саму оболонку. Тому ми можемо дізнатися, який процес є батьківським процесом нашої оболонки:
$ ps -p $$ -o args,ppid
COMMAND PPID
bash 1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server
Спробуємо з іншим термінальним додатком sakura
:
$ ps -p $$ -o args,ppid
COMMAND PPID
/bin/bash 16950
$ ps -p 16950 -o args
COMMAND
sakura
Звідти ми вже можемо побачити, що з чого почалася ця оболонка gnome-terminal
. Цей метод, звичайно, працює, якщо ви працюєте з інтерактивною оболонкою. Наприклад, якщо ми намагаємося дізнатись, хто з батьків bash -c '...'
або оболонки розпочався через ssh
, наприклад, PID цілком може бути з нетермінального додатку, а може і зовсім не GUI.
Отже, якщо ми хочемо спеціально розібратися з терміналом GUI, то, що ми можемо зробити, це запустити xprop
, натиснути на потрібне вікно, обв’язати його pid і дізнатися, як називається цей pid процесу, що відповідає. Або іншими словами:
$ ps aux | grep $(xprop | awk -F'=' '/PID/ {print $2}')
xieerqi 2124 0.6 1.7 208068 34604 ? Sl 18:47 1:49 gnome-terminal
Крім того, відповідно до специфікацій , менеджери вікон повинні встановити WM_CLASS
властивість. Таким чином, ми можемо отримати це xprop
також:
$ xprop WM_CLASS
WM_CLASS(STRING) = "sakura", "Sakura"
Звичайно, це має і свої 1% недоліків: налаштування WM_CLASS
властивостей покладається на те, що це робить менеджер вікон, і PID не гарантується, щоб вікно було точним (див. Який процес створив це вікно X11? ), Що може спричинити складну налагодження. І це не недоліки самих методів, а сервера X11. Однак більшість стабільних і добре відомих віконних менеджерів (наприклад, openbox, Metacity, blackbox) та більшість програм добре поводяться, тому ми не повинні очікувати проблем із чимось на зразок Gnome Terminal або Terminator.
Але якщо мова йде про емулятори терміналів GUI, нам навіть не потрібно знаходити команду. Ми можемо просто використовувати About
діалогове вікно самого вікна. Виняток із цього правила є xterm
.
$SHELL
, звичайно
ps | grep
? ps -p $$
! Або, тільки для команди, ps -p $$ -o cmd=
.
ps | grep
це просто погана форма. Більшість того, що можна зігріти, насправді можна отримати ps
самостійно або за допомогою інших інструментів.
Коротка версія (thx @Serg )
cat /etc/alternatives/x-terminal-emulator
Довга версія
sudo update-alternatives --config x-terminal-emulator
і шукати *
на виході
;)
Приклад виведення
There are 7 alternatives which provide `x-terminal-emulator’.
Альтернатива вибору ———————————————– 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:
Або, завдяки @muru , тут є більш детальний результат
$ 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
або update-alternatives: error: unknown argument
–config'`
--config
sudo
. Використанняupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
цілі цього символічного посилання, а не використовувати cat
його. file
Утиліта має бути встановлена на більшості систем і може бути використана , щоб знайти цільової виконуваний файл. cat
на символічному посиланні можна надрукувати будь-який скрипт оболонки або навіть двійковий файл залежно від цілі цього посилання (скрипт оболонки gnome-terminal
, двійковий файл urxvt
тощо).
Якщо ви хочете знати термінальну програму, яку ви використовуєте, скористайтеся цим:
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
Виконайте це відразу після відкриття терміналу (оболонки), не розпитуючи жодного екземпляра оболонки .
Коли ви відкриваєте термінальну програму, вона в основному породжує дочірню програму, оболонку. Отже, батьківською мовою нерегулярної оболонки є сам термінал. Іншими словами, PPID оболонки є PID термінальної програми.
Тут ми знаходимо батьківський ідентифікатор процесу (PPID) оболонки ( bash
) by ps -o 'ppid=' -p $$
, який буде ідентифікатором процесу термінальної програми.
Тоді ми знаходимо ім'я процесу з PID:
$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal
В основному це один вкладиш:
$ ps -o 'ppid=' -p $$
2268
$ ps -o 'cmd=' -p 2268
gnome-terminal
sshd: username@pts/4
. Примітка Я використовую PuTTY для підключення до машини. Це sshd
насправді емулятор терміналу?
Введіть у printenv
вікні терміналу, щоб переглянути всі змінні відкритого сеансу.
Введіть через echo $COLORTERM
вікно терміналу. ПРИМІТКА. Це працює не з усіма терміналами, один з них sakura
не повідомляє про це назад.
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
той, що нижче, - від aterm
терміналу.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
cat /etc/alternatives/x-terminal-emulator | grep exec
Вибірка зразка:
exec ('gnome-terminal', @ args);
Є відповідь для моєї системи: gnome-terminal .
Отже, введення gnome-terminal
мого терміналу відкриє ще одне ідентичне вікно терміналу.
Проста відповідь. Працює як для консолі, так і для ssh.
Приклад для простого символьного терміналу:
ssh username@systemname
echo $TERM
dumb
повідомляє вам, що ви не можете відкривати програми GUI на цьому з'єднанні
Приклад для xterm (також працює з PuTTY / Xming у Windows)
ssh -Y username@systemname -- omit this if using PuTTY --
echo $TERM
xterm
означає, що ви можете використовувати команди GUI, як-от відкрити редактор листівки чи менеджер файлів nautilus.
На консолі все те саме:
Open terminal window
echo $TERM
xterm
TERM
це не змінна, яка визначає емулятор терміналу за замовчуванням, а скоріше така, яка визначає можливості поточного. Наприклад, встановлення змінної на "xterm-color" дозволяє будь-якій програмі, що працює в терміналі, знати, що поточний термінал повинен розуміти кольори; встановивши його на "linux", повідомляє програмам, що це повинен бути VT; і т. д.