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.