Как изменить приглашение bash в терминале gnome, не испортив заголовок терминала в Ubuntu 16?

Как изменить приглашение bash в терминале gnome, не испортив заголовок терминала в Ubuntu 16?

Мне не нравится, когда все длинные пути к каталогам занимают место на моем терминале, поэтому я обрезаю их с помощью скрипта python. Я отредактировал файл .bashrc и заменил PS1 на

export PROMPT_COMMAND='PS1="$(python /home/vinay/bash_promt.py)"'.

И когда я это делаю, заголовок терминала больше не работает. Он просто отображает TerminalЧто раздражает. Я могу изменить заголовок вручную, выполнив следующую команду в bash:

PROMPT_COMMAND='echo -ne "\033]0;CUSTOM TITLE\007"'

Есть ли способ установить заголовок терминала в соответствии с пользовательским приглашением, которое задается в моем bash?

решение1

Для gnome-terminal заголовок терминала задается с помощью , PROMPT_COMMANDкоторый определен в /etc/profile.d/vte-2.91.sh.

PROMPT_COMMAND, как определено в этом скрипте, выполняет две функции:

  • изменяет заголовок терминала с помощью escape-последовательности OSC 0 ( \033]0;NEW_TITLE\007),

  • изменяет представление терминала о текущем каталоге с помощью escape-последовательности OSC 7 ( \033]7;NEW_CURRENT_DIRECTORY\007, это выносится в __vte_osc7функцию).

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

Таким образом, в скриптах запуска оболочки после поиска источника vte-2.91.shвам необходимо создать свой предпочитаемый файл PROMPT_COMMAND, который задает заголовок аналогично vte-2.91.sh, и задает текущий рабочий каталог точно так же, как это делается по умолчанию.

Я не знаю ни одного способа сослаться на PS1разрешенное значение (то есть после подстановки имени пользователя и т. п.) внутри PROMPT_COMMANDили где-либо еще (не говоря уже о том, чтобы отфильтровать управляющие последовательности, такие как изменение цвета). Если вы хотите видеть одну и ту же строку в приглашении и в заголовке окна, я считаю, что вам нужно продублировать конструкцию этой строки для PS1и PROMPT_COMMAND.

решение2

Это вам подойдет

открыть ~/.bashrc. Найдите строку, которая гласит:

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

Закомментируйте эту строку, поставив #перед ней символ:

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

Теперь добавьте эту строку (возможно, вы захотите поместить ее сразу после закомментированной строки):

PROMPT_COMMAND='echo -ne "\033]0;Custom Name\007"'

ЗаменятьCustom Nameна то, как вы хотите изменить заголовок Терминала.

Надеюсь это поможет.

решение3

Последовательность выхода, которую следует использовать:ESC]2;новое названиеBELгдеЕСКиБЕЛявляются символами escape и звонка. Например \[\e]2;NEWTITLE\a\]. Используя escape-последовательности #Bash, изменение заголовка в приглашении выглядит так:

export PS1='\[\e]2;new title\a\]prompt > ' ссылка на документ

Вот пример многоцветного усеченного приглашения bash, которое также имеет настраиваемый заголовок терминала:

export PS1='\[\e]2;$PWD\a\]\e[93m$USER\e[97m@\e[90m$HOSTNAME \e[93m$ \e[0m'

В этом примере заголовок терминала всегда будет отражать текущий рабочий каталог ( $PWD), а приглашение терминала всегда будет выглядеть следующим образом, независимо от того, в каком каталоге вы находитесь: user@hostname $.

Вы можете заменить $PWDна CUSTOM TITLE, чтобы заголовок терминала всегда отображал CUSTOM TITLE.

Обновлять
Будьте осторожны, когда не оборачиваете непечатаемые символы в \[и \]. Это работает без этого, и я делал это без них в течение многих лет. Однако, как я обнаружил сегодня с некоторыми настройками, этоможет вызвать некоторые проблемыв терминале. Ниже приведена более чистая версия с использованием переменных и обертыванием цветовых кодов:

T_YELLOW='\[\e[93m\]'
T_WHITE='\[\e[97m\]'
T_GRAY='\[\e[90m\]'
T_DEFAULT='\[\e[0m\]'
T_TITLE='\[\e]2;$PWD\a\]'
export PS1="${T_TITLE}${T_YELLOW}$USER${T_WHITE}@${T_GRAY}$HOSTNAME${T_YELLOW} $ ${T_DEFAULT}"

Связанный контент