Intereting Posts
Расширение разделов 18 миллиардов GB в GParted – как это было сделано? Проблема с Facebook в Google Chrome Каков наилучший способ сохранить все ваши файлы при переходе с Windows на Ubuntu? У VirtualBox нет меню устройств Поиск командной строки, используемой при запуске службы с помощью systemctl Как скомпилировать и установить новейшую версию передачи? Копирование файлов из каталогов с пробелами в имени boot застрял на "проверке состояния батареи " Выбирает только «Обновления безопасности» при установке сервера Ubuntu? Необходимо добавить «Boot from USB» в UEFI Boot Priority order Извлечение определенной строки после заданной строки из файла HTML с использованием сценария bash Невозможно отключить блокировку экрана в Ubuntu Gnome 15.04 Mr Transmission, пожалуйста, выключите ПК после завершения всех загрузок! Покупка нового ПК без UEFI Снова нажмите ярлык, чтобы отменить действие?

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

У меня есть gnome-terminal и Guake. Я хочу дать разные сообщения запуска, которые будут отображаться на этих эмуляторах терминала при их запуске. Какой код следует писать в .bashrc, чтобы это было достигнуто?

Эта функция должна выполнять работу:

container() { pid=$$ while true; do pid=$(ps -h -o ppid -p $pid 2>/dev/null) case $(ps -h -o comm -p $pid 2>/dev/null) in (gnome-terminal) echo "Running in gnome terminal";return;; (xterm) echo "Running in xterm";return;; (rxvt) echo "Running in rxvt";return;; (python) if [ ! -z "$(ps -h -o args -p $pid 2>/dev/null | grep guake)" ]; then echo "Running in Guake"; return; fi ;; esac [[ $(echo $pid) == 1 ]] && break done } container 

Вы можете получить имя эмулятора терминала, указав имя процесса для родителей. Поэтому он работает с каждым эмулятором терминала.

В bash, zsh и т. Д .:

 basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //') 

С рыбной раковиной:

 basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //') 

Попробуй это:

 echo $TERM 

Это более авторитетно, но может быть испорчено вашими программами. Однако по моему, он говорит, что xterm и на ttys говорит linux , что, я думаю, означает Linux Console.

Во многих системах linux echo $TERM return xterm см. Stazher post выше.

Чтобы использовать фактический терминал, сделайте следующее:

1: Закройте все экземпляры терминала в настоящий момент.

2: Откройте новый терминал, используя обычный метод.

3: Введите команду следующим образом:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

4: Возвращение должно быть примерно таким:

lxterminal --geometry=135x20

Вот разбивка:

Итак: ps – это «статус процесса»

ps option -o – Отображать информацию, связанную с указанным пробелом или запятыми. Звучит сложно, но на самом деле это не так. (пробел или запятая), разделенные (список ключевых слов).

Итак, (список ключевых слов) есть 'cmd=' Только одно ключевое слово в списке. Итак, просто попросите отобразить команду для открытия терминала.

ps option -p «по id процесса» Wow это очень хороший вариант для ps. Проблема в том, что вы должны передать ps этот идентификатор процесса. Итак, как получить идентификатор процесса? Мы разворачиваем выражение $(ps -o 'ppid=' -p $$)

Здесь мы должны начать думать немного глубже. Мне жаль, что я не изобрел этот баш-лайнер, но я этого не сделал. Кажется, я украл его с https://wiki.archlinux.org/ где-то, я больше не мог найти. Эти парни потрясающие, но много раз я не могу понять, что они говорят, пока после долгих исследований. Что мы можем сделать, это понять это сейчас, потому что я объясню.

поэтому мы знаем, что $ – оператор расширения в bash. Мне нравится думать «un-wrap». Таким образом, $(foo -opt bar) разворачивает или расширяет «foo -opt bar». Но в bash одиночная круглая скобка (...) открывает подоболочку.

Итак, $(foo -opt bar) расширяет «foo -opt bar», как работает в дочерней оболочке . Очень странно и трудно понять.

Итак, теперь мы снова запускаем почти идентичную команду, ps -o 'ppid=' -p $$ но на этот раз ps, статус процесса, показывает нам, что он может видеть из экземпляра дочерней оболочки .

-o список ключевых слов, только одно ключевое слово, как и раньше, но ppid= это запрашивает непосредственно идентификатор процесса родительской оболочки !! От НЕГО ДОЧЕРНИЙ ШЕЛЛ! Очень умный, да? Я так взволнован, когда могу это понять!

-p снова, «по id процесса», а в bash $$ – идентификатор процесса.

Если вы вызываете ps -o 'ppid=' -p $$ или любую другую команду, запрашивающую $$ непосредственно из первой оболочки, он может сказать pid = 1 или pid из xWindow или из вашей настольной программы, или вы возможно, получить реальный pid оболочки. Если вы спросите много раз, вы можете получить разные ответы каждый раз!

Но, если вы обратитесь к дочери и спросите ее: «Кто твой папа», она скажет вам! Очень умно. Хотелось бы, чтобы я был таким гением, чтобы изобрести этот метод.

Вы правы, я только ответил на заголовок вопроса, а не на вопрос в теле. Итак, вот вы идите, а Боб – дядя.

Я не уверен, в чем дело, в одном ответе, показанном выше. Такой переключатель не нужен. Мой скрипт ~ / .bashrc на самом деле является только одной простой строкой, все команды эха просто для удовольствия. Как объяснить…

Любой термин при запуске читает ~ / .bashrc и выполняет любые команды, которые он увидит в .bashrc. Таким образом, независимо от того, какой термин вызывается, он будет читать .bashrc и выполнять команды, поэтому только структура, необходимая в .bashrc, должна была бы изменить поведение или исключить один или несколько терминов. Желаемое поведение для каждого термина для выполнения одной и той же команды, поэтому case switch не требуется. Терминал сам расскажет вам, как его зовут, поэтому нет необходимости различать.

Примечание (1) Я не тестировал гейку, но работает для всех остальных, упомянутых в первом ответе jlliagre.

Примечание (2) Из-за форматирования в уценке для wiki вы не можете вырезать и вставить, как показано. Вы должны удалить каждый обратный ход , в том числе, чтобы удалить символы подчеркивания и добавить фактический обратный ход, без пробелов до ps или после -p $$) .

скрипт для ~ / .bashrc

 # show welcome message for actual terminal in use echo "Welcome. You are attempting to use" echo "" echo _backtick_ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)_backtick_ echo "" echo "Good Luck and God Speed." 

Это было очень весело. Я добавил это к своему собственному ~ / .bashrc.

если вы используете bash, я уверен, что эта команда вам поможет:

which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))

Если вы использовали ZSH, есть лучшее (более быстрое) решение, которое использует только встроенные функции ZSH и напрямую управляет /proc/$pid/{stat,cmdline} .

 get-terminal-emulator() { if [[ $TTY = "/dev/tty"* ]]; then echo "linux-console" return fi local pid=$$ name='' while true; do proc_stat=(${(@f)$(</proc/${pid}/stat)}) name=${proc_stat[2]//[()]/} case "${name}" in gnome-terminal|konsole|rxvt|xterm) echo "${name}"; return ;; python*) local cmdline=(${(@f)$(</proc/${pid}/cmdline)}) if [[ "$cmdline" =~ "\\bguake.main\\b" ]]; then echo "guake"; return fi ;; esac if test "$pid" = "1" -o "$pid" = ""; then echo "unknown" return fi pid=${proc_stat[4]} done }