Dato che stai iniziando a rasentare un PS1 complesso, potresti prendere in considerazione l'utilizzo di PROMPT_COMMAND
.
Con questo, lo imposti su una funzione e verrà eseguito dopo ogni comando per generare il prompt.
Puoi provare quanto segue nel tuo ~/.bashrc
PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs
__prompt_command() {
local EXIT="$?" # This needs to be first
PS1=""
local RCol='\[\e[0m\]'
local Red='\[\e[0;31m\]'
local Gre='\[\e[0;32m\]'
local BYel='\[\e[1;33m\]'
local BBlu='\[\e[1;34m\]'
local Pur='\[\e[0;35m\]'
if [ $EXIT != 0 ]; then
PS1+="${Red}\u${RCol}" # Add red if exit code non 0
else
PS1+="${Gre}\u${RCol}"
fi
PS1+="${RCol}@${BBlu}\h ${Pur}\W${BYel}$ ${RCol}"
}
Questo dovrebbe fare quello che sembra la linea che vuoi. Dai un'occhiata al sottofile del mio bashrc se vuoi vedere tutte le cose che faccio con il mio __prompt_command
funzione.
Se non vuoi usare il comando prompt ci sono due cose che devi tenere in considerazione:
- ottenere il valore di $? prima di ogni altra cosa, altrimenti verrà ignorato
- sfuggendo a tutti i $ nella PS1 (quindi non viene valutato quando lo assegni)
Esempio funzionante utilizzando una variabile
PS1="\$(VALU="\$?" ; echo \$VALU ; date ; if [ \$VALU == 0 ]; then echo zero; else echo nonzero; fi) "
Esempio funzionante senza una variabile
Qui l'if deve essere la prima cosa, prima di qualsiasi comando che sovrascriverebbe il $?
.
PS1="\$(if [ \$? == 0 ]; then echo zero; else echo nonzero; fi) "
Nota come il \$()
è sfuggito quindi non viene eseguito immediatamente ma ogni volta che viene utilizzato PS1. Anche tutti gli usi di \$?
Volevo mantenere i colori Debian predefiniti, stampare il codice esatto e stamparlo solo in caso di errore:
# Show exit status on failure.
PROMPT_COMMAND=__prompt_command
__prompt_command() {
local curr_exit="$?"
local BRed='\[\e[0;91m\]'
local RCol='\[\e[0m\]'
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
if [ "$curr_exit" != 0 ]; then
PS1="[${BRed}$curr_exit${RCol}]$PS1"
fi
}