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

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

#!/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" например)

  • Ввод текста из сценария оболочки
  • Как предотвратить включение ELinks в буфер прокрутки?
  • Возможно ли дополнить весь вывод терминала определенным символом?
  • scp .lzo, а затем несжатый и удалить файл .lzo
  • Проблемный расчет bc в сценарии оболочки
  • Выполнение скрипта в разрешениях zsh-файла
  • Но внутри сценария оболочки (rename.sh) $ PS1 пуст, и скрипт не работает.

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

    Кто-то может помочь мне понять это?

  • Как в пустой среде, как выглядят исполняемые файлы?
  • описание порядка сортировки
  • Как сохранить историю в истории?
  • операции макета экрана в .screenrc не работают
  • bash - почему \ x0d \ x20 стирает строку
  • Framebuffer на OpenBSD?
  • 2 Solutions collect form web for “Изменение текущего заголовка вкладки терминала внутри сценария оболочки”

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

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

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

     printf '\033]2;Hello\a' 

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

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

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

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

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

    Переменная 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' 
    Linux и Unix - лучшая ОС в мире.