Problema PS1, errore nella CLI


16

Ho fatto un semplice incarico su PS1

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

Tutto quello che volevo fare era cambiare il colore del prompt e visualizzare solo il percorso relativo. Tuttavia, questo incasina la CLI. Ad esempio, quando si sfoglia la cronologia con esso ritaglia e si sovrappone al display. Quando digito un comando lungo, il cursore si sposta all'inizio della schermata sovrapponendosi al display stesso. Cosa ho fatto di sbagliato?

Risposte:


30

Questo perché bash pensa che il prompt sia più lungo di quello che è. La sequenza di escape, \e[0;31mad esempio, viene risucchiata dal terminale, che a sua volta trasforma il seguente testo in rosso, ma Bash non lo sa. Quindi, devi dire a bash che quella sequenza di caratteri non deve essere conteggiata nella lunghezza del prompt e lo fai racchiudendolo in \[ \]. Consiglio anche di usare tput invece delle sequenze di escape del terminale hardcoding.

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

Vedi BashFAQ 53 e Introduzione ai codici terminali (ANSI / VT100) per ulteriori informazioni.


1
Grazie per la descrizione perfetta Ho avuto questo problema diverse volte e non so mai dove fosse il problema.
Betlista,

+1, lo stesso qui. Per coloro che testano ciecamente questa soluzione e non funziona, vale la pena menzionare qui che c'è un'altra sintassi descritta nel collegamento BashFAQ per sfuggire ai colori all'interno delle funzioni \001 \002.
Stephen Niedzielski,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.