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

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

Это распространенный метод для "игровых" программ, но я думаю, что он очень похож на тот, который вы ищете.

2
14.04.2017, 12:33
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'
1
27.01.2020, 21:51

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

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

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

printf '\033]2;Hello\a'

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

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

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

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

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

10
27.01.2020, 21:51

Теги

Похожие вопросы