У меня есть Ubuntu на моей машине, и я использую замечательный оконный менеджер. Как проверить, какой терминал у меня запущен? Есть ли команда для этого?
command-line
gnome-terminal
user4943481
источник
источник
Ответы:
TL; DR
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Значениеpid
позже может быть передано вps -p <pid> -o args
команду.Технически, для эмулятора терминала вам даже не нужна команда, как указано в комментариях :
Шелл против Терминала
Первое, что нам нужно уточнить, это то, что именно спрашивают - выяснить, работает ли оболочка или работает терминал. Часто эти два термина взаимозаменяемы, но в целом это разные вещи. Оболочка - это интерпретатор командной строки, в частности, интерактивная оболочка - это текстовое поле для приглашения и ввода текста, в котором вы вводите команды. Оболочки также могут быть неинтерактивными, например, скрипт запускает неинтерактивную оболочку или
bash -c 'echo hello world'
также запускает неинтерактивную оболочку.Напротив, терминал - это интерфейс к оболочке (хотя это может быть и другое приложение). Первоначально терминал относился к реальному оборудованию, но в настоящее время это в основном программное обеспечение. То, что вы видите, когда нажимаете Ctrl+ Alt+ tили щелкаете по значку терминала в графическом интерфейсе, это запускает эмулятор терминала, окно, которое имитирует поведение оборудования, и в этом окне вы можете видеть, как работает оболочка. Ctrl+ Alt+ F2(или любая из 6 функциональных клавиш) откроет виртуальную консоль, иначе
tty
. Я рекомендую прочитать Почему виртуальный терминал «виртуальный», и что / почему / где «настоящий» терминал? для получения дополнительной информации о специфике.Получение информации о оболочке
Каждому пользователю назначена оболочка по умолчанию
/etc/passwd
для его имени пользователя. Предполагая, что вы используете конфигурацию по умолчанию и еще не вызывали другую оболочку в качестве команды, достаточно сделать:Но, конечно, это показывает только значение по умолчанию . Предположим, мы делаем следующее:
Мы изначально были в
bash
, но начали интерактивный сеанс/bin/dash
, POSIX Ubuntu или системной оболочки . Переменная$SHELL
не изменится, потому что это не ее цель - она показывает значение по умолчанию, а не текущее значение. Нам нужно подойти к этому с другой точки зрения - с точки зрения процесса, о чем я уже говорил. Использую ли я bash или sh?Здесь мы используем преимущества
/proc/
файловой системы. Имя процесса и параметры командной строки отображаются в/proc/<pid>/comm
. Все, что нам нужно, это предоставить PID оболочки, что и$$
делает. В приведенном выше примере я добавляю это отдельно, но ничто не мешает нам делать толькоВариация на тему также может быть
Другой способ, которым мы могли бы подойти к этому, - проверить, где
/proc/<pid>/exe
. Этот файл является символической ссылкой, указывающей на исполняемый файл. Таким образом, мы можем сделатьЛюбой из двух подходов работает в 99% случаев. Конечно, есть способы, которыми они могут быть подорваны. Например, символическая не будет указывать в любом месте , если исполняемый файл был удален сразу после запуска оболочки (и в этом случае вы , вероятно, возникнут проблемы системы, так как удаление
/bin/sh
,/bin/dash
или даже/bin/bash
не рекомендуется - ведь много сценариев полагаться на них особенно системного уровня). Имя команды для shell обычно задается как самый первый аргумент вexecve()
syscall. Это описано в разделе Как bash знает, как он вызывается? , так что если у вас есть приложение, которое запускает оболочку через негоexecve()
, оно может дать ему любое имя. Но это нестандартные и нестандартные вещи, которых следует избегать ради последовательности и безопасности.Получение информации о терминале
Мы можем начать с переменных среды. Многие терминалы, по-видимому, маскируют себя как
xterm
-совместимые, о чем сообщаетecho $TERM
илиecho $COLORTERM
. Но тогда переменные среды не очень надежный инструмент. Они могут быть установлены и не установлены. Мы можем сделать то же самое снова с PID, за исключением того, что на этот раз мы рассмотрим родительский PID. Как вы, возможно, помните, терминал является интерфейсом оболочки и часто запускает саму оболочку. Поэтому мы можем выяснить, какой процесс является родительским процессом нашей оболочки:Давайте попробуем с другим терминальным приложением
sakura
:Оттуда мы уже можем видеть, что это начало этой оболочки
gnome-terminal
. Этот метод, конечно, работает, если вы работаете с интерактивной оболочкой. Если мы пытаемся выяснить родителяbash -c '...'
или оболочку, запущеннуюssh
, например, через PID, то вполне может быть, что нетерминальное приложение и, возможно, вообще не GUI.Поэтому, если мы хотим конкретно работать с терминалом с графическим интерфейсом, мы можем запустить его
xprop
, щелкнуть по нужному окну, grep его pid и узнать, как называется этот pid, соответствующий процессу. Или другими словами:Кроме того, согласно спецификациям , оконные менеджеры должны установить
WM_CLASS
свойство. Таким образом, мы можем получить это и отxprop
:Конечно, это также имеет свой 1% недостатков: настройка
WM_CLASS
свойств зависит от того, как это делает оконный менеджер, и PID не гарантирует точности окна (см. Какой процесс создал это окно X11? ), Что может включать в себя сложную отладку. И это не недостатки самих методов, а сервера X11. Однако большинство стабильных и хорошо известных оконных менеджеров (таких как openbox, Metacity, blackbox) и большинство приложений хорошо себя ведут, поэтому не стоит ожидать проблем с чем-то вроде Gnome Terminal или Terminator.Но когда дело доходит до эмуляторов терминала с графическим интерфейсом, нам даже не нужно искать команду. Мы можем просто использовать
About
диалог самого окна. Исключением из этого правила являетсяxterm
.источник
$SHELL
, конечноps | grep
?ps -p $$
! Или просто для командыps -p $$ -o cmd=
.ps | grep
это просто дурной тон. Большая часть того, что вы можете получить, может быть полученаps
сама или другими инструментами.Короткая версия (thx @Serg )
Длинная версия
и искать
*
в выводе;)
Пример вывода
Или, благодаря @muru , вот более подробный вывод
источник
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
и т. д.).Если вы хотите узнать, какую терминальную программу вы используете, используйте это:
Запустите это сразу после открытия терминала (оболочки), не разветвляя дальнейший экземпляр оболочки .
Когда вы открываете терминальную программу, она в основном порождает дочернюю программу, оболочку. Так что родителем порожденной оболочки является сам терминал. Другими словами, PPID оболочки - это PID программы терминала.
Здесь мы находим идентификатор родительского процесса (PPID) в shell (
bash
)ps -o 'ppid=' -p $$
, который будет идентификатором процесса программы терминала.Затем мы находим имя процесса из PID:
Это в основном один вкладыш:
источник
sshd: username@pts/4
. Обратите внимание, я использую PuTTY для подключения к машине. Наsshd
самом деле эмулятор терминала?Введите в
printenv
окне терминала, чтобы просмотреть все переменные открытого сеанса.Введите
echo $COLORTERM
из окна терминала. ПРИМЕЧАНИЕ: это не работает со всеми терминалами, один изsakura
них не сообщает об этом.тот, что ниже, от
aterm
терминала.источник
Если вам просто нужно имя терминальной программы, вы, скорее всего, найдете его в меню «Справка»> «О программе».
источник
Пример вывода:
Для моей системы есть ответ: gnome-terminal .
Таким образом, ввод
gnome-terminal
в мой терминал теперь откроет другое идентичное окно терминала.Источники:
источник
Простой ответ Работает как для консоли, так и для SSH.
Пример для простого символьного терминала:
говорит, что вы не можете открывать приложения с графическим интерфейсом для этого соединения
Пример для xterm (также работает с PuTTY / Xming в Windows)
означает, что вы можете использовать команды GUI, такие как открытие редактора leafpad или файлового менеджера nautilus.
На консоли это то же самое:
источник
TERM
это не переменная, которая определяет эмулятор терминала по умолчанию, а скорее переменная, которая определяет возможности текущего. Например, установка переменной «xterm-color» позволяет любой программе, работающей в терминале, знать, что текущий терминал должен понимать цвета; установка его в "linux" говорит программам, что это должен быть VT; и т. д.