Stringa PS1 colorata

Chiarimento: voglio che __foo sia eseguito each volta che la string PS1 viene presentata nel terminal, non quando la string PS1 viene costruita (quindi il suo essere in virgolette). __foo contiene una logica che esamina la directory corrente, quindi la sua esecuzione deve essere differita.


Sto cercando di utilizzare diversi colors nella mia string Bash PS1 da una function Bash:

 LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m" __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' } PS1='$(__foo '$LIGHTRED' '$LIGHTGREEN')\['$RESET'\] \$' 

Essenzialmente voglio __foo generare parte del PS1 in un mucchio di colors diversi. Il mio tentativo non sembra funzionare, però; produce la seguente output:

 -bash: 31m: command not found -bash: 32m: command not found \[]firstcolour \[\]secondcolour $ 

Che cosa dà e come posso risolverlo?

Utilizza la variabile di ambiente Bash $ PROMPT_COMMAND per ridefinire la variabile $ PS1 subito prima che venga visualizzata la richiesta.

 LIGHTRED='\033[1;31m' LIGHTGREEN='\033[1;32m' RESET='\033[m' __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n "\[$1\]firstcolour \[$2\]secondcolour" } PROMPT_COMMAND=$PROMPT_COMMAND'; PS1="$(__foo $RED $GRN)\[$OFF\]\n\$ "' 

Nota due ulteriori modifiche che ho fatto al tuo codice sono facoltative qui. Sono state aggiunte perché penso che chiarisca where / where non vengono espansi i codici di fuga:

  • Hard citazioni ' intorno alle variables di definizione del colore.
  • Soft citazioni " intorno alla string di return per __foo

La tua function foo restituisce una string che viene eseguita da bash come command, poiché l'hai circondato con $() (e ha eliminato tutte le sostituzioni di variables con marcature singole quote.

Cambiare il codice a questo rendono il lavoro perfetto:

 LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m" __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' } PS1=$(__foo $LIGHTRED $LIGHTGREEN)\[$RESET\]\$ 

Lo ho risolto:

 LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m" __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' } PS1='$(__foo "'$LIGHTRED'" "'$LIGHTGREEN'")\['$RESET'\] \$' 

Gli argomenti da __foo wherevano essere racchiusi in virgolette.