Проблема PS1, псує CLI


16

Я зробив просте завдання PS1

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

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

Відповіді:


30

Це тому, що Баш вважає, що підказка довша, ніж є. \e[0;31mНаприклад, послідовність евакуації засмучується терміналом, який, у свою чергу, перетворює наступний текст у червоний колір, але bash цього не знає. Отже, ви повинні сказати bash, що ця послідовність символів не повинна рахуватися в довжині підказки, і ви робите це, додаючи її \[ \]. Я також рекомендую використовувати tput замість послідовності виведення термінального терміналу.

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

Див. Вступ BashFAQ 53 та термінальні коди (ANSI / VT100) для отримання додаткової інформації.


1
Дякую за ваш ідеальний опис, у мене була ця проблема кілька разів, і ніколи не відомо, де була проблема.
Betlista

+1, тут же. Для тих, хто сліпо тестує це рішення, і воно не працює, тут варто згадати, що є інший синтаксис, описаний у посиланні BashFAQ для виходу кольорів у функції \001 \002.
Stephen Niedzielski
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.