Problem z PS1, psuje CLI

16

Zrobiłem proste zadanie na PS1

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

Chciałem tylko zmienić kolor zachęty i wyświetlić tylko ścieżkę względną. Jednak to psuje CLI. Na przykład podczas przeglądania historii za pomocą przycina i nakłada się na ekran. Po wpisaniu długiego polecenia kursor przesuwa się na początek ekranu, który pokrywa się z samym monitem. Co zrobiłem źle?

yayu
źródło

Odpowiedzi:

30

To dlatego, że bash uważa, że ​​podpowiedź jest dłuższa niż jest. Na \e[0;31mprzykład sekwencja ucieczki zostaje wciągnięta przez terminal, który z kolei zmienia tekst na czerwony, ale bash tego nie wie. Musisz więc powiedzieć bashowi, że ta sekwencja znaków nie powinna być liczona w długości monitu, a robisz to, dołączając ją \[ \]. Polecam także użycie tput zamiast sekwencji ucieczki terminalu na stałe.

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

Zobacz BashFAQ 53 i wprowadzenie kodów terminali (ANSI / VT100), aby uzyskać więcej.

geirha
źródło
1
Dzięki za doskonały opis. Miałem ten problem kilka razy i nigdy nie wiem, gdzie był problem.
Betlista,
+1, to samo tutaj. Dla tych, którzy ślepo testowania tego rozwiązania, a to nie praca, to warto wspomnieć, że istnieje inna składnia opisane w linku BashFAQ do ucieczki kolory wewnątrz funkcji \001 \002.
Stephen Niedzielski