Perché questo prompt di bash a volte mantiene parte dei comandi precedenti durante lo scorrimento della cronologia?


29

Il mio prompt di bash, che ammetto di aver rubato da alcuni punti e messo insieme, a volte aggiungerà parte dei comandi precedenti alla sua lunghezza quando si scorre la cronologia di bash con le frecce su / giù.

Ad esempio, se i miei comandi precedenti fossero:

ls
cd /home/caleb
vim .bashrc

Quando ero al mio prompt e ho fatto scorrere due volte verso l'alto, potrebbe apparire come:

$ vim .bcd / home / caleb

Dove sono rimasti i primi cinque caratteri dall'ultimo comando.

Qualcuno ha idea del perché questo accada e come può essere fermato?

Il mio prompt è impostato con questo codice (troppo lungo per includerlo qui): https://gist.github.com/1679352


1
Imposta PS1 su un valore senza l'intero schifo di vcs e guarda cosa succede. Questa è la mia ipotesi.
Daniel Beck

Hai già trovato il colpevole nel tuo prompt? Sto avendo lo stesso problema.
Acme,

Sì, bash lo perde sui colori e non è in grado di separare la lunghezza delle stringhe con escape di colore dalla lunghezza della stringa visibile. Questo è ciò a cui SiegeX stava arrivando. Ho finito per passare a ZSH e usando un prompt diverso. ZSH non ha lo stesso problema.
Caleb Thompson,

1
Entrambe le risposte precedenti non hanno risolto il mio problema e non hanno dato spiegazioni sul perché ciò sia accaduto. Verifica che il prompt Bash personalizzato si sovrascriva da solo , se qualcuno ha cercato fino a questo punto.
D3Hunter il

Risposte:


6

Da qualche parte il tuo prompt è fubar. Quello che succede di solito è che la tua shell pensa che stia generando codici di termini non stampabili e si aspetta che occupi spazio. Il miglior consiglio che posso darti è quello di aggiungere sistematicamente (o rimuovere) il tuo prompt fino a quando questo comportamento non si interrompe per isolare il codice che causa questo problema.


37

I codici colore devono essere racchiusi tra parentesi quadre. Le parentesi indicano a bash che il testo allegato non deve essere stampato

basandosi sull'esempio di @ Phreditor, questo mostra che qualsiasi formattazione eseguita dopo la nuova riga comporterà il problema originale:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

il wrapping del codice di formato in [] garantisce che non si verifichino comportamenti fastidiosi:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

La documentazione: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

Poiché la formattazione di PS1 fa sì che il valore sia così lungo e difficile da leggere, inserisco i codici di formato in variabili:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

3
Questa dovrebbe essere la risposta accettata. Ha risolto il problema.
Atcold,

1
Va notato (perché non l'ho notato;)), che in quel casino di barre rovesciate e parentesi quadre, le parentesi quadre che seguono la sequenza di escape \033NON devono essere sfuggite. Solo le parentesi quadre avvolgenti devono essere sfuggite.
Benjam,

Il modo di confondere il fatto che io abbia a che fare con tutti quei personaggi speciali, usando il primo risultato di Google mi ha aiutato a generare un prompt di lavoro esattamente come lo desideravo: ezprompt.net
Mallox,

Ho desiderato personalizzare i miei colori di richiesta per ANNI, ma non l'ho mai visto da quando ho sempre avuto questo problema! Non riuscivo mai a capire perché, quindi, mi sono appena fermato e ho mantenuto tutto bianco ... Stavo solo installando un nuovo computer e alla fine mi sono reso conto di aver effettivamente Google il problema per una volta ... Così felice di averlo fatto! Grazie per questa meravigliosa lezione.
TylerH4,

8

Ho avuto lo stesso problema ed era correlato alle definizioni dei colori.

Nel mio caso, ho un prompt a più righe (dà più spazio al comando corrente indipendentemente dalla lunghezza del percorso visualizzata dal prompt).

Versione non valida:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

Buona versione:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00mtermina il colore. Se è dopo la nuova riga ( \n), impedisce un corretto ridisegno nel terminale, per sovrascrivere i comandi precedenti con il colore di sfondo. Spostandolo dietro la nuova linea si è risolto il problema.

(utilizzando Terminale in Mac OS 10.8)


Ciò ha individuato il problema per me, mentre l'attuale risposta accettata era troppo generica.
Brian,

Questa è la risposta più precisa e dovrebbe essere il vincitore (ed è stata anche la soluzione al mio problema).
Craveytrain,

il \ncolpevole era anche per me. Grazie!
mhulse,

3

In realtà penso che ciò abbia a che fare con un delimitatore mancante di "carattere non stampabile". Ho avuto esattamente lo stesso problema, ma spostandolo prima della nuova riga (\ n) non è stato risolto. Invece ho circondato correttamente tutti i caratteri non stampabili (qui, i comandi di colorazione) con '\ [' e '\]'.

Cattivo (funziona, ma presenta il problema di cancellazione della cronologia descritto sopra):

PS1="\e[32m\u\e[35m@\e[32m\h \e[33m\w\e[36m\n\$\e[0m"

Buono (circondato da tutti i comandi di colore con '\ [' e '\]' - non mostra la cronologia dei comandi schiacciati):

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

i.e. "\e[...m" --becomes--> "\[\e[...m\]"

E se lo stai inserendo in qualcosa come SecureCRT per l'invio automatico all'accesso a un sistema, potresti dover evitare il doppio di tutto (mettere doppie barre rovesciate ovunque) se il sistema di accesso automatico consuma la prima barra rovesciata stessa per determinare il carattere da inviare :

PS1="\\[\\e[32m\\]\\u\\[\\e[35m\\]@\\[\\e[32m\\]\\h \\[\\e[33m\\]\\w\\[\\e[36m\\]\\n\\$\\[\\e[0m\\]"

i.e. "\..." --becomes--> "\\..."

(Questo è sicuramente vero per SecureCRT e può essere vero per gli altri, come PuTTY o TeraTerm - test richiesti da parte tua.)

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.