funzione per PS1 ignora condizionale, aiuto!

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Eberoth
Linux 2.x
Linux 2.x
Messaggi: 403
Iscritto il: lun 24 ago 2009, 9:22
Slackware: -current
Kernel: 3.13.6
Desktop: KDE4
Distribuzione: Slackel64

funzione per PS1 ignora condizionale, aiuto!

Messaggio 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

Rispondi