Відображення команди в рядку заголовка xterm


23

Наразі мій рядок Bash встановлює заголовку рядка 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чи подібного. Мені потрібно було трохи розробити це - дивіться мою відповідь тут для отримання додаткової інформації :)


Дякуємо за це рішення simon! Однак, додаючи це до моєї .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.
orschiro

До речі, я щойно передавав stackoverflow.com/questions/48407130/… , імовірно, запитуючи в результаті застосування цієї поради. Пастка повинна писати безпосередньо на stderr або TTY, а не на stdout.
Чарльз Даффі

1
@orschiro, порада запустити trapкоманду як окрему команду , а не призначати її PS1.
Чарльз Даффі

12

(Натхненний цією відповіддю на SU )

Ви можете комбінувати кілька баш-трюків:

  • Якщо ви вловите сигнал 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

Також "вбиває" завершення на "вкладці"
прірва.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.
Чарльз Даффі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.