Come posso interrompere un colore PS1 della shell bash per fermarsi alla fine del comando?


12

Ho un colore PS1 personalizzato in cui ho i comandi shell reali in un colore distinto, solo così posso vedere rapidamente quali comandi ho digitato e separarlo dall'output del comando stesso.

Supponiamo che il colore in PS1 sia impostato su "blu" per il prompt dei comandi e che il colore predefinito nella mia shell sia bianco.

  • Digito un comando, ad esempio ls, (ls -l è di colore blu)
  • L'output che genera, la prima riga è ancora blu
  • Tutta la riga rimanente diventa bianca

Quello che voglio è che tutto l'output dopo il comando sia 'bianco'.

Un altro esempio:

  • Digito un comando 'cat', il colore è blu
  • L'output arriva, l'intero output è blu

Vorrei che l'output fosse 'bianco' mantenendo il prompt dei comandi che ho digitato 'blu'

Su alcuni comandi, va bene, altri comandi, lo stesso colore trabocca nella prima riga dell'output e quindi entra in gioco il colore predefinito e alcuni altri comandi, l'intero output (ad esempio cat) ha lo stesso colore.

C'è un modo per mantenere solo i comandi che ho digitato in un colore e il resto sui valori predefiniti?

Sono su OSX.

EDIT # 1

Ecco uno screenshot a cui @derobert è collegato nei commenti che mostra ciò che sto cercando.

                 ss # 1


2
Devi mostrarci il tuo prompt in modo che possiamo individuare gli errori.
Glenn Jackman,

Risposte:


14

Fondamentalmente vuoi reimpostare il colore del terminale appena prima che bash esegua il comando. Questo può essere fatto con a trap.

Per esempio:

trap '[[ -t 1 ]] && tput sgr0' DEBUG

Bash esegue la DEBUGtrap immediatamente prima del comando, quindi ciò comporterà tput sgr0(che reimposta gli attributi di formattazione) prima di ogni comando.

La [[ -t 1 ]]è un controllo di sicurezza per assicurarsi che STDOUT è in realtà un terminale. Potrebbero esserci alcuni casi in cui STDOUT di bash non è collegato a un terminale (piping, ssh remoto, ecc.) E quindi non si desidera tputinviare codici di escape del terminale.


Dove lo metti? Diciamo che PS1 non ripristina il colore. Ora come si aggiunge questa riga per eseguire questo comando subito dopo che l'utente ha inserito il suo comando e premuto Invio?
polimero

1
@polym nel tuo .bashrc(o ovunque $PS1sia impostato). Lo metterei proprio accanto alla $PS1definizione in modo da sapere che sono correlati.
Patrick,

ok wow che funziona. Qualche possibilità che questo possa andare storto?
polimero

@polym non più
Patrick,

geniale, è esattamente ciò di cui avevo bisogno per ripristinare il colore del terminale.
iQ.
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.