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

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

#!/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 пуст.

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

  • Почему мой вывод не завершается в tmux?
  • Фиксация прокрутки в nano, запущенной в tmux в mate-terminal
  • как прокручивать несколько строк в завершении экрана zsh
  • Как предотвратить закрытие терминала при запуске программы с завершением?
  • Как найти количество вертикальных линий, доступных в терминале?
  • Как узнать «уровень» снарядов, в которых я?
  • Автоматическое завершение терминала OSX bash - нечетное поведение на двойной вкладке
  • Как эхо (строка (исполняемый файл)) в приглашении, чтобы курсор мигал в конце строки?
  • 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' 
    Interesting Posts

    Несовместимые версии libsqlite3-0 (i386 и amd64) блокируют друг друга

    Как я могу понять, совместим ли USB-адаптер Ethernet с определенной версией ядра, чтобы использовать его для загрузки ядра / файловой системы?

    Какими процессами порты (в качестве конечных точек связи) относятся к пересылке портов SSH?

    Плохая производительность с Java

    Как преобразовать структуру дерева файлов JSON в одну строку?

    Повторное использование похожих флагов для нескольких команд

    Может ли система Linux иметь два IP одновременно?

    Как найти зависимости, требуемые пакетами RPM

    Искать в меньшей степени с обтеканием в EOF

    Почему результаты сравнения строк всегда ложны

    Как отлаживать скрипты csh?

    Bash Brace Shell Expansion Fail

    Должны ли / etc / hosts содержать имя домена или полное доменное имя?

    Шлем (ранее ничего), Идо и подобные инструменты для Emacs: Перекрытие и различия

    Обновление скручивания в Centos 5.6

    Linux и Unix - лучшая ОС в мире.