Qualche ora fa, quando era ancora normale essere svegli, mi è venuta la malsana idea di "raffinare" il codice che profuce il mio prompt PS1.
Siccome sono un maniaco della personalizzazione, mi ritrovo con un pastrocchio difficile da leggere in .bashrc e volevo riordinarlo un po' usando una funzione e qualche variabile. Il problema è che il nuovo codice sembra ignorare i test per verificare il tipo di utente, eseguendo la prima opzione indipendentemente dalla guardia. Gli altri condizionali invece funzionano perfettamente.
Questo è il codice in questione, frutto di una mezzoretta di lavoro e consultazione di tutorial vari:
Codice: Seleziona tutto
set_prompt(){
local Last_Command=$?
local Red='\[\e[0;31m\]'
local B_Red='\[\e[1;31m\]'
local U_Red='\[\e[4;31m\]'
local HI_Red='\[\e[0;91m\]'
local Green='\[\e[0;32m\]'
local B_Green='\[\e[1;31m\]'
local U_Green='\[\e[4;32m\]'
local HI_Green='\[\e[0;92m\]'
local HI_White='\[\e[0;97m\]'
local Color_Reset='\[\e[0m\]'
local FancyX='\342\234\227'
local Checkmark='\342\234\223'
#Print a newline, because i like it, followed be the current time, in [HH:MM] 24h format, green color.
PS1="\\n$Green[\A]>"
# If root, just print root in red. Otherwise, print the current user and host in green
if [ "`id -u`" = "0" ]; then
PS1+="$B_Red\\u$Green@\\h:"
else
PS1+="$B_Green\\u$Green@\\h:"
fi
#Print the working directory in the default text color.
PS1+="$Color_Reset\w"
# Add a bright white exit status for the last command on a new line
PS1+="\\n$Color_Reset\$? "
# If it was successful, print a green checkmark. Otherwise, print a red X.
if [ "$Last_Command" = "0" ]; then
PS1+="$Green$Checkmark "
else
PS1+="$Red$FancyX "
fi
#If root, print the prompt marker in red, otherwise print it in green
if [ "`id -u`" = "0" ]; then
PS1+="$B_Red\\$ $Color_Reset"
else
PS1+="$B_Green\\$ $Color_Reset"
fi
}
PROMPT_COMMAND='set_prompt'
ovviamente, le parti di codice in questione sono quelle che iniziano con if [ "`id -u" = "0" ] ... ho provato a sostituirlo con "$EUID" ma non cambia nulla: ottengo sempre il prompt rosso che ho impostato per root, e mai quello verde dell'utente. Il resto funziona senza problemi.
La cosa strana è che, nel vecchio codice, ci sono esattamente gli stessi condizionali, e funzionano perfettamente!
(vecchio codice, per confronto)
Codice: Seleziona tutto
view_ex_stat(){
if [ $? = 0 ]; then
echo -e " Ok :)"
else
echo -e " ERR :("
fi
}
if [ "$TERM" = "xterm" ] ; then
if [ "`id -u`" = "0" ]; then
PS1='\n\[\e[0;32m\][\A]>\033\[\e[1;31m\]\u\[\e[0;32m\]@\h:\[\e[1;34m\]\w\033[0m\n $( view_ex_stat $? )\[\e[0;31m\] \$ \[\e[0m'
else
PS1='\n\[\e[0;32m\][\A]>\033\[\e[1;32m\]\u\[\e[0;32m\]@\h:\[\e[1;34m\]\w\033[0m\n $( view_ex_stat $? )\[\e[0;32m\] \$ \[\e[0m'
fi
elif [ "$TERM" = "linux" ] ; then
if [ "`id -u`" = "0" ]; then
PS1='\n\[\e[0;32m\][\A]>\[\e[0;31m\]\u\[\e[0;32m\]@\h:\[\e[0;34m\]\w\033[0m\n $( view_ex_stat $? )\[\e[0;31m\] \$ \[\e[0;32m\]'
else
PS1='\n\[\e[0;32m\][\A]>\[\e[0;32m\]\u\[\e[0;32m\]@\h:\[\e[0;34m\]\w\033[0m\n $( view_ex_stat $? )\[\e[0;32m\] \$ '
fi
fi