У меня есть Ubuntu на моей машине, и я запускаю потрясающий менеджер окон сверху ее. Как я проверяю, какой терминал я выполняю? Существует ли команда для него?
Короткая версия (спасибо @Serg)
cat /etc/alternatives/x-terminal-emulator
<час> долгая версия
sudo update-alternatives --config x-terminal-emulator
и ищет *
в выводе
;)
<час>Пример произвел
There are 7 alternatives which provide `x-terminal-emulator’.
Selection Alternative ———————————————– 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'.
Если Вы хотите знать терминальную программу, Вы используете, используете это:
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $)
Выполнение это сразу после открытия терминала (оболочка) , не разветвляясь дальше окружает экземпляр .
при открытии терминальной программы она в основном порождает дочернюю программу, оболочку. Таким образом, родитель порожденной оболочки является самим терминалом. Другими словами, PPID оболочки является PID терминальной программы.
Здесь мы находим идентификатор родительского процесса (PPID) оболочки (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
Введите в printenv
из окна терминала для просмотра всех переменных открытого заседания.
Тип в echo $COLORTERM
из окна терминала. ПРИМЕЧАНИЕ: это не работает со всеми терминалами, один как sakura
не сообщает это.
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
тот ниже от aterm
терминал.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
Если Вы просто захотите название терминальной программы, Вы по всей вероятности найдете его под Справкой> О.
Простой ответ. Работы для обеих консолей или 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 как открытие leafpad редактора или файлового менеджера наутилуса.
На консоли это - то же:
Open terminal window
echo $TERM
xterm
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Значение pid
позже может быть передан ps -p <pid> -o args
команда.Технически, для эмулятора терминала Вам даже не нужна команда, как указано в комментариях:
под чем Вы подразумеваете который? Нажмите Help->, About то, что он? – JoKeR
Первая вещь, которую мы должны разъяснить, - то, что точно спрашивают - узнают рабочую оболочку или рабочий терминал. Часто эти два термина используются попеременно, но они - разные вещи в целом. Shell является интерпретатором командной строки, специфически интерактивная оболочка является подсказкой плюс текстовое поле, где Вы вводите команды. Оболочки могут также быть неинтерактивными, например, сценарий запускает неинтерактивную оболочку, или bash -c 'echo hello world'
также запускает неинтерактивную оболочку.
В отличие от этого, терминал является интерфейсом для окружения (хотя это могло быть другое приложение также). Первоначально терминальный упомянул фактические аппаратные средства, но в наше время они - главным образом программное обеспечение. Что Вы видите, когда Вы нажимаете Ctrl+Alt+t или нажимаете на терминальный значок в GUI, который запускает эмулятор терминала, окно, которое подражает поведению аппаратных средств, и в том окне, которое Вы видите, что оболочка выполняет. Ctrl+Alt+F2 (или любая из этих 6 функциональных клавиш) откроет виртуальную консоль, иначе tty
. Я рекомендую читать, Почему виртуальный терминал является “виртуальным”, и what/why/where является “реальным” терминалом? для большего количества информации о специфических особенностях.
Каждому пользователю присвоили оболочку по умолчанию им в /etc/passwd
для их имени пользователя. Принятие Вас использует конфигурацию по умолчанию и не назвало другую оболочку явно как команду, достаточно сделать:
echo $SHELL
Но конечно это единственное выставочное значение по умолчанию. Предположим, что мы делаем следующее:
user@ubuntu:~$ dash
$
Мы были первоначально в bash
, но запустил интерактивную сессию /bin/dash
, POSIX Ubuntu или системная оболочка. Переменная $SHELL
не изменится, потому что это не его цель - она показывает значение по умолчанию не текущее значение. Мы должны будем приблизиться к этому с другой точки зрения - перспектива процесса, который является чем-то, в чем я покрыл, я использую удар или 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
. Но затем переменные среды не являются очень надежным инструментом. Они могут быть установлены и сброшены. Мы можем сделать то же самое с PIDs снова, кроме этого времени, мы посмотрим на родительский 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
, нажмите на желаемое окно, 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, Метагород, черный ящик) и большинство приложений хорошего поведения, таким образом, мы не должны ожидать проблемы с чем-то как Терминал Gnome или Терминатор.
Но когда дело доходит до эмуляторов терминала GUI, мы не должны даже находить команду. Мы можем просто использовать About
диалоговое окно самого окна. Исключение к тому правилу xterm
.
cat /etc/alternatives/x-terminal-emulator | grep exec
Демонстрационный вывод:
должностное лицо ('гном-terminal',@args);
Существует ответ для моей системы: терминал гнома.
Так, ввод gnome-terminal
в мой терминал теперь откроет другое идентичное окно терминала.