Команда отображения в заголовке xterm

23

My Bash Prompt в настоящее время устанавливает заголовок xterm, используя следующую последовательность:

PS1='\033]0;\u@\h>\w\007'

Есть ли простой способ отобразить текущую команду в заголовке. Например, если я отслеживаю файл с помощью tail -f foo.log, я хочу, чтобы мой заголовок сказал tail -f foo.log.

кендырь
источник

Ответы:

16

В основном вам нужно:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

в конце вашего .bashrcили аналогичного. Мне понадобилось время, чтобы разобраться с этим - см. Мой ответ здесь для получения дополнительной информации :)

Саймон
источник
Спасибо за это решение, Саймон! Однако, добавляя это к моей .bashrcпосле каждой команды в моей оболочке, я получаю этот вывод 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Я предполагаю, что могу подавить этот вывод, назначив команду trap PS1? Однако PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGне работает. Это приводит к ошибке bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
Орширо
Кстати, я только что отправил stackoverflow.com/questions/48407130/… , спросил, предположительно, в результате применения этого совета. Ловушка должна писать непосредственно в stderr или TTY, а не в stdout.
Чарльз Даффи
1
@orschiro, совет запускать trapкоманду как отдельную команду , а не назначать ее для PS1.
Чарльз Даффи
12

(Вдохновлен этим ответом SU )

Вы можете комбинировать парочку трюков с bash:

  • Если вы перехватываете сигнал DEBUG, обработчик вызывается перед выполнением каждой команды
  • Переменная $BASH_COMMANDсодержит текущую команду

Итак, перехватите DEBUG и обработчик установит заголовок на $BASH_COMMAND:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

Это будет держать заголовок измененным, пока что-то другое не изменит его, но пока вы $PS1остаетесь прежним, это не будет проблемой - вы запускаете команду, обработчик DEBUG меняет заголовок заголовка, а когда команда завершает работу, bash рисует новый подскажите и сбрасывает ваш заголовок снова.

Полезный совет, найденный здесь (также откуда этот ответ SU), должен включать:

set -o functrace

Это заставит bash распространить ловушку DEBUG на все запущенные вами субоболочки; иначе заголовок в них не изменится

Михаил Мрозек
источник
ха! один и тот же ответ в одно и то же время! +1 за обработку подоболочек, но есть ли у вас ответ на проблему с трубами? (см. мою ссылку на вопрос SO)
Simon
Не работаетssh
бездна.7
Также «убивает» завершение на «вкладке»
abyss.7
Кстати, я только что отправил stackoverflow.com/questions/48407130/… , спросил, предположительно, в результате применения этого совета. Ловушка должна писать непосредственно в stderr или TTY, а не в stdout.
Чарльз Даффи
Не лучше ли перенаправить /dev/ttyвместо stderr?
Аарон Дигулла
2

Я работал над своим решением из разных постов. Это создает заголовок, содержащий пользователя, имя хоста, pwd, tty и выполняемую в настоящее время команду (для bash).

Это выглядит так (команда не выполняется):

.:[user@hostname:/home/user][pts/10]:.

И вот так (выполняя команду):

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

Где-то в .bashrc я расширил PS1:

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

Добавляет текущую команду, используя историю 1 и ловушку :

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

Не стесняйтесь принять к вашим потребностям.

Алехандро Аланис
источник
Кстати, я только что отправил stackoverflow.com/questions/48407130/… , спросил, предположительно, в результате применения этого совета. Ловушка должна писать непосредственно в stderr или TTY, а не в stdout.
Чарльз Даффи