Pagina 1 di 1

funzione per PS1 ignora condizionale, aiuto!

Inviato: gio 27 mar 2014, 6:10
da Eberoth
Salve,
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'
(ve lo avevo detto che mi piace personalizzare le cose..)

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