Personalizzare la shell bash: grassetto / colora il comando


13

Esistono numerosi tutorial / post online (ad es. Http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/ ) su come personalizzare il tuo prompt in bash impostando PS1. C'è un modo per personalizzare il colore / il grassetto del comando che scrivo?

In altre parole, ad esempio, diciamo che volevo un prompt verde, un comando in grassetto blu e quindi l'output in qualsiasi colore sarebbe predefinito. Nell'esempio seguente, so già come " joe>" mostrare come verde, blu, grassetto, qualunque sia l'impostazione PS1. Ma c'è un modo in cui posso rendere lo git statusspettacolo audace, per esempio?

joe> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
...

Se vuoi una shell davvero buona dovresti usare zsh, quello che vuoi ottenere lì sarebbe molto semplice conpreexec() { printf '\e[0m' }
bollovan,

3
@bollovan - "Davvero buono" è un po 'soggettivo, lo trovo davvero detestabile a causa del suo gonfio e della non conformità POSIX. Ma qualunque cosa galleggi la tua barca.
Chris Down,

@ChrisDown bloat galleggia sulla tua barca - non l'ho mai sentita, abbastanza divertente.
n611x007,

Risposte:


13

Dovresti lasciare un colore in coda dopo la PS1 (avvialo dopo >nel tuo esempio), quindi utilizzare la DEBUGtrap bash per cancellare il colore prima dell'esecuzione del comando (ma dopo aver premuto Invio nella shell. Prova qualcosa di simile :

shopt -s extdebug
trap "tput sgr0" DEBUG

per qualcuno estraneo sfuggire ai codici: ciò preserverebbe la colorazione originale del comando (es. sarebbe ls --color=alwayscolorato)?
n611x007,

@naxa - Sì, poiché imposta esplicitamente i codici colore (ad eccezione dei colori che sono colorati nel colore terminale predefinito, che avrà effetto solo dopo il primo colore).
Chris Down,

Questo trucco sembra interferire con il completamento della scheda (stampa cose strane come ^[(B^[[m). Succede solo su alcuni sistemi: l'ho provato su due sistemi, entrambi con Ubuntu 12.04 LTS, e solo uno di essi ha avuto l'interferenza.
musiphil,

7

Per completezza, ecco come impostare un colore di prompt e il colore di input della riga di comando in bash. Inserisci queste righe nel tuo .bashrc.

PS1='\[\e[1;34m\]\w\$ \[\e[0;32m\]'
trap 'printf \\e[0m' DEBUG

La trap DEBUG, come suggerito da Chris Down , viene utilizzata per ripristinare gli attributi del testo. È pensato per il debug, ma è anche utile per eseguire il codice prima di eseguire il comando digitato dall'utente .

Nell'impostazione del prompt:

  • \[…\] viene utilizzato attorno alle sequenze di escape per indicare a bash che non utilizzano alcun valore dello schermo (senza di essi, lo schermo si confonderebbe quando bash deve ridisegnare il prompt).
  • \e[…mdove è un numero, o più in generale una sequenza di numeri separati da punti e virgola, è una sequenza di escape inviata al terminale per influenzare il colore e altri attributi del testo seguente. Ad esempio, 1;34imposta il blu grassetto; 0;32ripristina tutti gli attributi, quindi cambia il colore in verde. Regola a piacere.
  • \w\$stampa la directory corrente e $o #. Puoi ovviamente cambiarlo come preferisci e inserire le modifiche degli attributi di testo nel mezzo, se lo desideri.
  • C'è una modifica finale dell'attributo alla fine, che imposta il colore dell'input di testo.

Cordiali saluti, codici colore / sequenze bash possono essere cercati qui: misc.flogisoft.com/bash/tip_colors_and_formatting
kaiwan

0

Sto solo imparando i comandi BASH e sono stato seduto qui a giocare con i comandi color nella mia versione. Ho capito questa soluzione:

Usando questo comando:

PS1='\[\e[0:36m\]\h>\[\e[0;31m\]'

Decostruisci: PS1 =: avvia il comando PS1

'': contiene il comando tra virgolette singole (quindi BASH non pensa che sia un comando per questo)

\: ogni singolo comando inizia con questo

[]: contiene ciascun comando

\ e (potrebbe anche essere \ 033 un carattere di escape ASCII): avvia un comando color

Il comando color precede l'oggetto a cui si applica.

[\ e [0; 36m]: ciano

\ h: nome host

'>': stampato dopo il nome host

[\ e [0; 31m]: rosso

Apparentemente, il comando rosso alla fine rende rosso l'ingresso. Basta cambiare i colori a proprio piacimento ed è quello che stai cercando.

Inoltre, questo sito mi ha aiutato un po ':

https://www.linuxnix.com/linuxunix-shell-ps1-prompt-explained-in-detail/

La mia versione: GNU bash, v. 4.2.46

Stai attento,

Donnola

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.