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.