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

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

22
задан 24 June 2015 в 01:56

7 ответов

Короткая версия (спасибо @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'.
12
ответ дан 23 November 2019 в 01:32

Если Вы хотите знать терминальную программу, Вы используете, используете это:

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
9
ответ дан 23 November 2019 в 01:32

Введите в printenv из окна терминала для просмотра всех переменных открытого заседания.

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

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

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

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
3
ответ дан 23 November 2019 в 01:32

Если Вы просто захотите название терминальной программы, Вы по всей вероятности найдете его под Справкой> О.

3
ответ дан 23 November 2019 в 01:32

Простой ответ. Работы для обеих консолей или 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
-1
ответ дан 23 November 2019 в 01:32

TL; DR

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

    под чем Вы подразумеваете который? Нажмите Help->, About то, что он? – JoKeR

Shell по сравнению с терминалом

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

23
ответ дан 23 November 2019 в 01:32
cat /etc/alternatives/x-terminal-emulator | grep exec

Демонстрационный вывод:

должностное лицо ('гном-terminal',@args);

Существует ответ для моей системы: терминал гнома.

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

Источники:

0
ответ дан 23 November 2019 в 01:32

Другие вопросы по тегам:

Похожие вопросы: