Изменить заголовок текущей вкладки терминала внутри скрипта оболочки

Изменить заголовок текущей вкладки терминала внутри скрипта оболочки

Я нашел этот скрипт для изменения заголовка текущей вкладки терминала:

#!/usr/bin/env bash
T=$1
ORIG=$PS1
TITLE="\e]2;$T\a"
PS1=${ORIG}${TITLE}
echo "Terminal tab title changed to $T"

Это работает хорошо, если я ввожу их непосредственно в терминал ( TITLE="\e]2;HELLO\a"например, с помощью)

Но внутри скрипта оболочки (rename.sh) $PS1 пуст и скрипт не работает.

rename.sh HELLO выводит "Terminal tab title changed to HELLO" , но заголовок терминала не меняется. Внутри скрипта $PS1 пуст.

Кто-нибудь может мне помочь это понять?

решение1

Скрипт работает, устанавливая интерактивное приглашение оболочки в строку, которая включает коды управления для управления xtermзаголовком окна. Каждый раз, когда отображается приглашение оболочки, выводятся коды управления для изменения заголовка окна.

Но, конечно, внутри скрипта интерактивное приглашение никогда не отображается, поэтому эти команды не имеют заметного эффекта (хотя если бы вы запустили другую интерактивную оболочку из скрипта, вы могли бы увидеть изменение заголовка окна). И поскольку ни один скрипт не может изменить среду своего родительского процесса, изменение теряется после завершения вашего скрипта.

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

printf '\033]2;Hello\a'

Это меняет заголовок окна один раз, но если какая-либо другая программа позже снова его изменит, ваш старый заголовок будет утерян. Трюк с изменением вашего приглашения широко распространен, потому что некоторые популярные программы в прошлом часто меняли заголовок вашего окна вскоре после того, как вы меняли его по своему вкусу (хотя я не думаю, что это распространенная проблема сейчас). Недостаток в том, что если что-то имеет реальную причину изменить заголовок вашего окна, он теперь будет заменен, как только ваша оболочка снова отобразит свое приглашение.

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

Кстати, приглашение Bash должно включать дополнительные управляющие коды, чтобы сообщать Bash, когда часть приглашения фактически имеет нулевую ширину, что касается расчета ширины отображения приглашения. Вы обнаружите, что перенос строк является нестабильным, если вы вводите длинную команду, а затем вам нужно сделать возврат, например; Bash попытается перерисовать приглашение, но сделает это в неправильном месте, поскольку он думает, что управляющие коды экрана влияют на ширину приглашения. Вам нужно будет добавить их \[и \]управляющие коды Bash вокруг них.

PS1="$ORIG\[$TITLE\]"

(Фигурные скобки на самом деле ничего не дают и затрудняют чтение, поэтому я их убрал.)

решение2

Переменная PS1используется только в интерактивной оболочке, чтобы получить к ней доступ, вам необходимо начать свой скрипт с bash -i rename.sh.

Минимальный пример:

$ echo 'echo $PS1' > test

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

$ bash test
$ bash -i test

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

#!/bin/bash -i

Уведомлениеэто работает только если вы chmod и запускаете скрипт напрямую (например ./rename.sh, ), а не с bash rename.sh, в противном случае вам придется вызывать bash -i rename.shснова.

Редактировать

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

echo -e '\033]2;SomeTitle\007'

или внутри скрипта с переменными

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

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