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.