Проблема PS1, портящая CLI

16

Я сделал простое задание PS1

PS1="\e[0;31m[\W]\$ \e[m "

Все, что я хотел сделать, это изменить цвет подсказки и отобразить только относительный путь. Однако это портит CLI. Например, при просмотре истории он обрезает и перекрывает дисплей. Когда я набираю длинную команду, курсор перемещается в начало экрана, перекрывающегося с самим отображением подсказки. Что я сделал не так?

yayu
источник

Ответы:

30

Это потому, что bash считает, что приглашение длиннее, чем оно есть. \e[0;31mНапример, escape-последовательность засасывается терминалом, который, в свою очередь, красит следующий текст, но bash этого не знает. Итак, вы должны сказать bash, что эта последовательность символов не должна учитываться в длине приглашения, и вы делаете это, заключая ее в \[ \]. Я также рекомендую использовать tput вместо управляющих последовательностей терминала.

red=$(tput setaf 1)
reset=$(tput sgr0)
PS1='\[$red\][\W]\$\[$reset\] '

Подробнее см. BashFAQ 53 и Коды терминалов (ANSI / VT100) .

geirha
источник
1
Спасибо за ваше идеальное описание, у меня была эта проблема несколько раз, и я никогда не знал, где была проблема.
Бетлиста
+1, здесь тоже самое. Для тех, кто слепо тестирует это решение, и оно не работает, стоит упомянуть здесь, что в ссылке BashFAQ описан другой синтаксис для экранирования цветов внутри функций \001 \002.
Стивен Недзельски