Як перевірити, яким терміналом я користуюся?


23

У мене на моїй машині є Ubuntu, а над цим я працює дивовижний менеджер вікон. Як перевірити, на якому терміналі я працюю? Чи є для нього команда?


5
що ви маєте в виду , який ? Клацніть Довідка -> Про це це?
JoKeR

3
Який термінал означає термінальну програму або оболонку?
heemayl

Відповіді:


24

TL; DR

  • знайти поточне використання оболонки ls -l /proc/$$/exe
  • щоб знайти поточний термінал, використовуйте xprop _NET_WM_PID WM_CLASS. Значення pidпізніше може бути передано ps -p <pid> -o argsкоманді.
  • Технічно для емулятора терміналу вам навіть не потрібна команда, як зазначено в коментарях :

    що ти маєш на увазі під чим? Клацніть Довідка -> Про це це? - JoKeR

Shell vs Terminal

Перше, що нам потрібно буде уточнити - це, що саме просять - з’ясувати запущену оболонку або запущений термінал. Часто ці два терміни вживаються взаємозамінно, але вони зовсім різні речі. 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.


O_o $SHELL, звичайно
AB

Еек. Чому ви користуєтесь людьми ps | grep? ps -p $$! Або, тільки для команди, ps -p $$ -o cmd=.
муру

@muru, тому що я менш досвідчений користувач, ніж ви, і у мене немає всіх запам’ятованих PS прапорів> _ <тупо
Сергій Колодяжний

2
Ні я, але ps | grepце просто погана форма. Більшість того, що можна зігріти, насправді можна отримати psсамостійно або за допомогою інших інструментів.
муру

ПРИМІТКА: я оновив свою відповідь, оскільки спочатку це питання спочатку було незрозумілим, і його частини потребують певного досвіду; З часом я також зрозумів, що є кращі способи викликати команди.
Сергій Колодяжний

12

Коротка версія (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'.

2
cat /etc/alternatives/x-terminal-emulator | grep exec
Сергій Колодяжний

Чи потрібна встановлена ​​утиліта? Я отримую Binary file (standard input) matchesабо update-alternatives: error: unknown argument –config'`
Терранс,

Не забудьте, це--config
Терранс,

1
Вам не потрібно sudo. Використанняupdate-alternatives --display x-terminal-emulator
муру

Для короткої версії ви можете розглянути можливість використання file /etc/alternatives/x-terminal-emulatorцілі цього символічного посилання, а не використовувати catйого. fileУтиліта має бути встановлена на більшості систем і може бути використана , щоб знайти цільової виконуваний файл. catна символічному посиланні можна надрукувати будь-який скрипт оболонки або навіть двійковий файл залежно від цілі цього посилання (скрипт оболонки gnome-terminal, двійковий файл urxvtтощо).
chris544

9

Якщо ви хочете знати термінальну програму, яку ви використовуєте, скористайтеся цим:

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

1
Коли я запускаю цю команду, я отримую sshd: username@pts/4. Примітка Я використовую PuTTY для підключення до машини. Це sshdнасправді емулятор терміналу?
користувач3731622

3

Введіть у printenvвікні терміналу, щоб переглянути всі змінні відкритого сеансу.

Введіть через echo $COLORTERMвікно терміналу. ПРИМІТКА. Це працює не з усіма терміналами, один з них sakuraне повідомляє про це назад.

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

той, що нижче, - від atermтерміналу.

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

echo $ COLORTERM у звітах сакури пустим
Сергій Колодяжний,

@ Серг, дякую. Схоже, це варіант xterm тоді.
Терранс,

@Serg просто цікаво, чи подобається тобі Сакура? І що вас привертає до цього?
Терранс,

Це гаразд, нічого зовсім особливого, досить спрощеного. Я спробував різноманітні емулятори терміналів: термінатор, roxterm, tilde, спадний (забув, як це називається, щось починається з R). Я думаю, це компроміс між xterm та gnome-terminal
Сергій Колодяжний,

@ Серг Ах, це добре знати. Я збираюся це перевірити. :-) Я завжди шукаю хорошого терміналу, який працює з моїм сценарієм keepalive, який надсилає їм ключі xdotool.
Терранс,

3

Якщо ви просто хочете назву програми терміналу, ви, ймовірно, знайдете її в розділі Довідка> Про.


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

Вибірка зразка:

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

Є відповідь для моєї системи: gnome-terminal .

Отже, введення gnome-terminalмого терміналу відкриє ще одне ідентичне вікно терміналу.

Джерела:

  • Коментар Сергія Колодяжного під відповідь AB .

-1

Проста відповідь. Працює як для консолі, так і для 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; і т. д.
Cybolic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.