У меня есть Ubuntu на моей машине, и я использую замечательный оконный менеджер. Как проверить, какой терминал у меня запущен? Есть ли команда для этого?
У меня есть Ubuntu на моей машине, и я использую замечательный оконный менеджер. Как проверить, какой терминал у меня запущен? Есть ли команда для этого?
Ответы:
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
, конечно
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) в 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
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 .
Таким образом, ввод gnome-terminal
в мой терминал теперь откроет другое идентичное окно терминала.
Простой ответ Работает как для консоли, так и для 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
TERM
это не переменная, которая определяет эмулятор терминала по умолчанию, а скорее переменная, которая определяет возможности текущего. Например, установка переменной «xterm-color» позволяет любой программе, работающей в терминале, знать, что текущий терминал должен понимать цвета; установка его в "linux" говорит программам, что это должен быть VT; и т. д.