Можно ли установить заголовок экрана с помощью сценария оболочки?
Я подумал о чем-то вроде отправки клавишных команд ctrl+A shift-A Name
enter кбд>
Я около часа искал, как эмулировать нажатия клавиш в сценарии оболочки, но не нашел ответа.
Можно ли установить заголовок экрана с помощью сценария оболочки?
Я подумал о чем-то вроде отправки клавишных команд ctrl+A shift-A Name
enter кбд>
Я около часа искал, как эмулировать нажатия клавиш в сценарии оболочки, но не нашел ответа.
Вы можете установить заголовок экрана / 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 ниже.
"\e]2;title\a"
работал.
- person Denilson Sá Maia; 06.03.2013
\007
(BEL) в конце. (Сохранение Джеймса Бонда в качестве напоминания может быть полезным, LOL.) Скорее всего, это причина, по которой у Денилсона не было шансов заставить вашу линию работать.
- person syntaxerror; 23.11.2014
.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-последовательности действительно необходимо применять каждый раз при изменении подсказки. Таким образом, строка обновляется при каждой вводимой вами команде и может отслеживать такую информацию, как текущий рабочий каталог, имя пользователя, имя хоста и т. д. Некоторые оболочки предоставляют для этой цели специальные функции, а некоторые — нет, и нам приходится вставлять последовательности заголовков. непосредственно в строку подсказки. Это проиллюстрировано в следующем разделе.
Ниже приведены другие способы написания сценария переименования заголовков экрана:
Добавление следующих настроек в .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"
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\$ '
Вы также можете вызвать экран и указать ему установить заголовок:
screen -X title "new title"
Если вы находитесь в окне экрана, оно установит имя этого окна. Если вы не находитесь на экране, будет установлено имя последнего открытого окна.
Чтобы добавить к ответу Эспо, управляющие последовательности 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'
Чтобы включить автоматическое обновление заголовка при использовании 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
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 между множеством хостов из здесь
Мое решение этой проблемы состояло в том, чтобы создать bash-скрипт и добавить его в мой файл ~/.bashrc:
set-title() {
ORIG==$PS1
TITLE="\e];$@\a"
PS1=${ORIG}${TITLE}
}
Теперь, когда я нахожусь в любом сеансе оболочки bash, я набираю «set-title required_title», и он меняется на «желаемый заголовок». Это работает для нескольких версий Ubuntu, в настоящее время на Kinetic 16.04.
Я получил это решение от здесь. Я искал его снова, не мог найти и решил опубликовать его здесь для всех, кто заинтересован.
Я получил это решение, экспериментируя с другими, такими как @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\$ '
Я пробовал это в Ubuntu 18.10, и это работало только с PROMPT_COMMAND в ~/.bashrc. И если вы переопределите PROMPT_COMMAND, поведение заголовка немного изменится. Решил менять только в случае необходимости:
t() {
TITLE="$@"
PROMPT_COMMAND='echo -ne "\033]0;${TITLE}\007"'
}
введите здесь описание изображения