Установить заголовок экрана из шеллскрипта

Можно ли установить заголовок экрана с помощью сценария оболочки?

Я подумал о чем-то вроде отправки клавишных команд ctrl+A shift-A Name enter

Я около часа искал, как эмулировать нажатия клавиш в сценарии оболочки, но не нашел ответа.


person Beerweasle    schedule 06.11.2009    source источник


Ответы (11)


Вы можете установить заголовок экрана / xterm, используя следующие строки:

#!/bin/bash

mytitle="Some title"
echo -e '\033k'$mytitle'\033\\'

[ОБНОВЛЕНИЕ] - по запросу я также включаю решение, предложенное @Espo ниже:

В зависимости от вашей версии xterm или вашего дистрибутива Linux приведенная выше строка может работать или не работать, и вы можете попробовать значения по умолчанию для xterm:

#!/bin/bash

mytitle="Some title"
echo -e '\033]2;'$mytitle'\007'

Подробнее см.: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s3 или обратитесь к ответу @Espo ниже.

person Shirkrin    schedule 06.11.2009
comment
Это не сработало для меня. Я тестировал в xterm и в Konsole (из KDE4). "\e]2;title\a" работал. - person Denilson Sá Maia; 06.03.2013
comment
Это не будет работать, если включен параметр «Разрешить отправку событий», который используется по умолчанию в последних версиях Ubuntu: bugs.launchpad.net/ubuntu/+source/xterm/+bug/495733 - person Arie Skliarouk; 11.07.2013
comment
Я думаю, мы можем согласиться с тем, что универсального решения не существует (вздох). Лучшим примером здесь является Konsole, которая могла использовать \033k (или \ek), но предпочитает \e]2; (или наоборот.. как \e]2; кажется, это xterm по умолчанию) - person Shirkrin; 12.07.2013
comment
@Shirkrin Пожалуйста, прочитайте, что Эспо процитировал ниже. Вы должны отправить \007 (BEL) в конце. (Сохранение Джеймса Бонда в качестве напоминания может быть полезным, LOL.) Скорее всего, это причина, по которой у Денилсона не было шансов заставить вашу линию работать. - person syntaxerror; 23.11.2014
comment
Обратите также внимание на то, что строка приглашения пользователя довольно часто включает настройку заголовка окна. поместите в конце ;sleep 10s, и если окно изменится и изменится обратно, вам нужно настроить $PS1 - person Perkins; 22.11.2017
comment
Спасибо, второй вариант работает и в терминале GNOME (по умолчанию в Linux Mint). Однако это происходит из командной строки, а не из сценария bash/shell. Он отображается во время выполнения скрипта, но возвращается к .bashrc PS1 после завершения скрипта. - person LuH; 24.10.2019

Из http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s3

экранированные последовательности xterm

Заголовки окон и значков могут быть изменены в запущенном xterm с помощью управляющих последовательностей XTerm. В этом отношении полезны следующие последовательности:

  • ESC]0;stringBEL -- Установить имя значка и заголовок окна в виде строки
  • ESC]1;stringBEL -- Установить имя значка в виде строки
  • ESC]2;stringBEL -- Установить заголовок окна в виде строки

где ESC — управляющий символ (\033), а BEL — символ звонка (\007).

Печать одной из этих последовательностей в xterm приведет к изменению заголовка окна или значка.

Примечание: эти последовательности применимы к большинству производных xterm, таких как nxterm, color-xterm и rxvt. Другие типы терминалов часто используют другие escape-последовательности; примеры см. в приложении. Полный список escape-последовательностей xterm см. в файле ctlseq2.txt, входящем в дистрибутив xterm, или в файле xterm.seq, входящем в дистрибутив rxvt.

Печать escape-последовательностей

Для информации, которая остается неизменной на протяжении всего времени существования этой оболочки, такой как хост и имя пользователя, достаточно будет просто вывести escape-строку в rc-файле оболочки:

    echo -n "\033]0;${USER}@${HOST}\007"

должен создать заголовок вида username@hostname, при условии, что переменные оболочки $USER и $HOST установлены правильно. Требуемые параметры эха могут различаться в зависимости от оболочки (см. примеры ниже).

Для информации, которая может измениться в течение срока службы оболочки, например, для текущего рабочего каталога, эти escape-последовательности действительно необходимо применять каждый раз при изменении подсказки. Таким образом, строка обновляется при каждой вводимой вами команде и может отслеживать такую ​​информацию, как текущий рабочий каталог, имя пользователя, имя хоста и т. д. Некоторые оболочки предоставляют для этой цели специальные функции, а некоторые — нет, и нам приходится вставлять последовательности заголовков. непосредственно в строку подсказки. Это проиллюстрировано в следующем разделе.

person Espo    schedule 06.11.2009
comment
Однако экран, похоже, полностью игнорирует это, хотя я нашел фрагменты, использующие как \ekTITLE\e\\, так и \e]0;TITLE\a (последний, по-видимому, без какого-либо использования). Возможно, это связано с настройкой жесткого состояния экрана - я использую там следующее: строка жесткого состояния SCREEN @ %H: %-n - %t (%t относится к заголовку окна) - person blueyed; 14.06.2010

Ниже приведены другие способы написания сценария переименования заголовков экрана:

Добавление следующих настроек в .ssh/config автоматически устанавливает заголовок экрана при входе в систему с использованием SSH:

Host *
  PermitLocalCommand yes
  LocalCommand [ "$TERM" == 'screen' ] && echo -ne "\033k%h\033\\" 

Вместо %h, представляющего имя хоста машины, к которой вы подключаетесь, вы можете использовать %n, которая является фактическим именем/псевдонимом, который вы использовали для подключения к машине.

ПРИМЕЧАНИЕ. Вам нужен OpenSSH >= v5.1, чтобы иметь возможность использовать параметры Localhost %n и %h. Проверьте 'man ssh_config' для получения дополнительной информации о LocalCommand.

Чтобы автоматически вернуть заголовок обратно к имени хоста локального хоста, после закрытия сеанса SSH вы можете добавить escape-последовательность к вашей переменной приглашения PS1 в .bashrc :

export PS1='you_favorite_PS1_here'
if [ "$TERM" == 'screen' ]; then
    export PS1=${PS1}'\[\033k\h\033\\\]'
fi

Эти трюки особенно полезны при использовании конфигурации .screenrc, которая показывает вам, на какой вкладке экрана вы работаете в данный момент. Добавьте что-то вроде следующего в .screenrc, чтобы это заработало:

caption always "%{= kY}%-w%{= Yk}%n %t%{-}%+w%{ kG} %-= @%H - %LD %d %LM - %c"
person Johnny Halfmoon    schedule 22.06.2012
comment
Использование LocalCommand echo "$TERM" | grep -q 'screen' && echo -ne "\033k%n\033\\" также будет работать в tcsh - person Erwin Vrolijk; 22.08.2016

Попробуйте приведенные ниже команды, не нужно редактировать какой-либо файл или конфигурацию, например ~/.bashrc, можно использовать во время выполнения.

Установить статический текст в качестве заголовка: (Мой заголовок)

export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Установить локальную/глобальную переменную в качестве заголовка: ($USER)

export PS1='\[\e]0;$USER\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Установить вывод команды как заголовок: (имя хоста)

export PS1='\[\e]0;`hostname`\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Установить значение по умолчанию (вернуться):

export PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
person Seff    schedule 20.03.2014
comment
Это меняет подсказку. - person developerbmw; 04.08.2016

Вы также можете вызвать экран и указать ему установить заголовок:

screen -X title "new title"

Если вы находитесь в окне экрана, оно установит имя этого окна. Если вы не находитесь на экране, будет установлено имя последнего открытого окна.

person idbrii    schedule 24.02.2011

Чтобы добавить к ответу Эспо, управляющие последовательности xterm также можно применить к переменной Bash PS1.

ESC]0;stringBEL -- Set icon name and window title to string
ESC]1;stringBEL -- Set icon name to string
ESC]2;stringBEL -- Set window title to string

Пример

PS1='\e]0;string\a'
person Steven Penny    schedule 04.05.2012

Чтобы включить автоматическое обновление заголовка при использовании ssh, добавьте это в ~/.bashrc:

ssh() {
  echo -n -e "\033k$1\033\\"
  /usr/bin/ssh "$@"
  echo -n -e "\033k`hostname -s`\033\\"
}
echo -n -e "\033k`hostname -s`\033\\"

См. http://linuxepiphany.blogspot.com.ar/2010/05/good-screenrc-config-setup.html

person mijhael3000    schedule 08.02.2014
comment
Вероятно, вам следует предпочесть printf echo -n e - person tripleee; 14.11.2018

 # add the following in your ~/.bashrc or ~/.bash_profile
 PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

или, что еще лучше, скопируйте всю концепцию настройки ваших конфигураций bash между множеством хостов из здесь

person Yordan Georgiev    schedule 28.07.2017

Мое решение этой проблемы состояло в том, чтобы создать bash-скрипт и добавить его в мой файл ~/.bashrc:

set-title() {
  ORIG==$PS1
  TITLE="\e];$@\a"
  PS1=${ORIG}${TITLE}
}

Теперь, когда я нахожусь в любом сеансе оболочки bash, я набираю «set-title required_title», и он меняется на «желаемый заголовок». Это работает для нескольких версий Ubuntu, в настоящее время на Kinetic 16.04.

Я получил это решение от здесь. Я искал его снова, не мог найти и решил опубликовать его здесь для всех, кто заинтересован.

person Flurin Arner    schedule 28.01.2019

Я получил это решение, экспериментируя с другими, такими как @flurin-arner. Я начал @weston-ganger title-in-gnome-terminal/186167#186167">set-title(). Я также использовал предложение @imgx64 PROMPT_DIRTRIM. Я также использую @itseranga приглашение ветки git, хотя это не имеет ничего общего с вопросом, но показывает, что вы можете делать с подсказкой.

Сначала, как показано Вестоном и выше

 TITLE="\[\e]2;$*\a\]"

можно использовать для ручной установки заголовка терминала, «$*» — это ввод командной строки, но не то, что нам нужно.

2-й, как уже говорилось, я также добавляю ветку git в свою подсказку, опять же, не в вопросе.

export PROMPT_DIRTRIM=3
parse_git_branch() {
       git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
     }

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "

3-й, в порядке эксперимента я скопировал код TITLE выше, установил фиксированную строку $* и попробовал это:

see: \[\e]2;'SomeTitleString'\a\]

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\[\e]2;'SomeTitleString'\a\] $ "

Это дало желаемый эффект! В конечном счете, я хотел, чтобы базовый путь был моим названием. Параметры PS1 показывают, что \W является базовым путь, поэтому мое решение таково:

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\[\e]2;\W\a\] $ "

без ветки git:

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\[\033[00m\]\[\e]2;\W\a\] $ "

в результате появляется приглашение с git-branch:

user@host ~/.../StudyJava (master) $  

в результате появляется приглашение без parse_git_branch:

   user@host ~/.../StudyJava $  

где pwd дает

/home/user/somedir1/otherdir2/StudyJava

и название терминала

StudyJava

ПРИМЕЧАНИЕ. Из приведенного выше @seff я по существу заменяю «Мой заголовок» на «\ W»

export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
person mancocapac    schedule 22.05.2019

Я пробовал это в Ubuntu 18.10, и это работало только с PROMPT_COMMAND в ~/.bashrc. И если вы переопределите PROMPT_COMMAND, поведение заголовка немного изменится. Решил менять только в случае необходимости:

t() {
  TITLE="$@"
  PROMPT_COMMAND='echo -ne "\033]0;${TITLE}\007"'
}

введите здесь описание изображения

person Hoxz    schedule 23.12.2019