Как проверить, какой терминал я использую?

23

У меня есть Ubuntu на моей машине, и я использую замечательный оконный менеджер. Как проверить, какой терминал у меня запущен? Есть ли команда для этого?

user4943481
источник
5
что вы имеете в виду , который ? Нажмите Справка -> О том, что это?
JoKeR
3
Какой терминал означает терминальную программу или оболочку?
Heemayl

Ответы:

24

TL; DR

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

    что ты имеешь в виду под этим? Нажмите Справка -> О том, что это? - JoKeR

Шелл против Терминала

Первое, что нам нужно уточнить, это то, что именно спрашивают - выяснить, работает ли оболочка или работает терминал. Часто эти два термина взаимозаменяемы, но в целом это разные вещи. Оболочка - это интерпретатор командной строки, в частности, интерактивная оболочка - это текстовое поле для приглашения и ввода текста, в котором вы вводите команды. Оболочки также могут быть неинтерактивными, например, скрипт запускает неинтерактивную оболочку или 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не изменится, потому что это не ее цель - она ​​показывает значение по умолчанию, а не текущее значение. Нам нужно подойти к этому с другой точки зрения - с точки зрения процесса, о чем я уже говорил. Использую ли я 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не рекомендуется - ведь много сценариев полагаться на них особенно системного уровня). Имя команды для shell обычно задается как самый первый аргумент в execve()syscall. Это описано в разделе Как bash знает, как он вызывается? , так что если у вас есть приложение, которое запускает оболочку через него 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.

Поэтому, если мы хотим конкретно работать с терминалом с графическим интерфейсом, мы можем запустить его xprop, щелкнуть по нужному окну, grep его 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.

Но когда дело доходит до эмуляторов терминала с графическим интерфейсом, нам даже не нужно искать команду. Мы можем просто использовать Aboutдиалог самого окна. Исключением из этого правила является xterm.

Сергей Колодяжный
источник
О_о $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'.
AB
источник
2
cat /etc/alternatives/x-terminal-emulator | grep exec
Сергей Колодяжный
Есть ли утилита, которая мне нужна? Я получаю Binary file (standard input) matchesили update-alternatives: error: unknown argument -config'`
Terrance
Неважно, это--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) в shell ( bash) 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
heemayl
источник
1
Когда я запускаю эту команду, я получаю sshd: username@pts/4. Обратите внимание, я использую PuTTY для подключения к машине. На sshdсамом деле эмулятор терминала?
user3731622
3

Введите в printenvокне терминала, чтобы просмотреть все переменные открытого сеанса.

Введите echo $COLORTERMиз окна терминала. ПРИМЕЧАНИЕ: это не работает со всеми терминалами, один из sakuraних не сообщает об этом.

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

тот, что ниже, от atermтерминала.

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
Терренс
источник
echo $ COLORTERM in sakura сообщает о пустом месте
Сергей Колодяжный
@ Серж спасибо. Похоже, это вариант xterm.
Терранс
@ Серж, просто интересно, нравится ли тебе Сакура? И что тебя к этому привлекает?
Терранс
Все в порядке, ничего особенного, довольно упрощенного. Я пробовал различные эмуляторы терминала: терминатор, roxterm, тильда, выпадающий (забыл, как он называется, что-то, начинающееся с R). Я думаю, что это компромисс между xterm и gnome-терминал
Сергей Колодяжный
@ Серж А, это приятно знать. Я собираюсь проверить это. :-) Я всегда в поиске хорошего терминала, который работает с моим скриптом keepalive, который отправляет им ключи xdotool.
Терренс
3

Если вам просто нужно имя терминальной программы, вы, скорее всего, найдете его в меню «Справка»> «О программе».

thesdog
источник
0
cat /etc/alternatives/x-terminal-emulator | grep exec

Пример вывода:

Exec ( 'гном-терминал', @ арг);

Для моей системы есть ответ: gnome-terminal .

Таким образом, ввод gnome-terminalв мой терминал теперь откроет другое идентичное окно терминала.

Источники:

Габриэль Стейплс
источник
-1

Простой ответ Работает как для консоли, так и для SSH.

Пример для простого символьного терминала:

ssh username@systemname
echo $TERM
dumb

говорит, что вы не можете открывать приложения с графическим интерфейсом для этого соединения

Пример для xterm (также работает с PuTTY / Xming в Windows)

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

означает, что вы можете использовать команды GUI, такие как открытие редактора leafpad или файлового менеджера nautilus.

На консоли это то же самое:

Open terminal window
echo $TERM
xterm
SDsolar
источник
TERMэто не переменная, которая определяет эмулятор терминала по умолчанию, а скорее переменная, которая определяет возможности текущего. Например, установка переменной «xterm-color» позволяет любой программе, работающей в терминале, знать, что текущий терминал должен понимать цвета; установка его в "linux" говорит программам, что это должен быть VT; и т. д.
Cybolic