LEZIONE del 9 Novembre

Poichè la shell di Unix è un linguaggio di programmazione, per eseguire le istruzioni contenute in uno shell script, è necessario specificare l'ambiente di esecuzione, ossia come si propagano i side-effect durante l'esecuzione di ogni singola istruzione. Pertanto, si deve specificare qual'è l'ambiente che deve essere attivo prima che inizi l'esecuzione di ogni istruzione.

L'ambiente di esecuzione è determinato dal valore che prendono un certo numero di variabili associate alla shell e che, per questo, si dicono anche variabili d'ambiente. L'argomento verrà trattato di seguito ma, per un riferimento esauriente ed approfondito, si consiglia di consultare il manuale in linea della shell bash.

GRAMMATICA DELLA SHELL

Durante l'esecuzione dei comandi di shell l'interprete Bash utilizza il valore di un certo numero di variabili d'ambiente che possono modificate dalla stessa esecuzione del comando. Alcune di esse sono assegnate solamente dal sistema e non possono essere assegnate dall'utente ma, soltanto, lette dalla shell.

Variabili di Shell

Volendo essere precisi fra le variabili d'ambiente ce se sono alcune che non possono essere assegnate esplicitamente dall'utente. In questo senso si deve intendere che le seguenti variabili sono assegnate dalla shell:

Le seguenti variabili sono usate dalla shell. In alcuni casi, la shell assegna un valore di default alla variabile; questi casi sono considerati a parte.

Le precedenti non esauriscono tutte le variabili d'ambiente attive durante una sessione di lavoro. Per sapere quali sono tutte le variabili assegnate e il loro valore è sufficiente eseguire il comando printenv.

Gestione della Variabile PATH

Nell'esempio che segue viene proposto uno shell script per la manipolazione della variabile d'ambiente PATH che mantiene tutti i cammini per le directory in cui sono contenuti i possibili eseguibili corrispondenti ai comandi di shell.

#!/bin/bash
#   path : manipulate the environment variable PATH
#   Synopsis : path -<action> [<fullpath>] 
#
function Help() {
  echo "Synopsis:  path -<action> [<fullpath>]"
  echo "Available actions"
  echo "   i: add the given path as first"
  echo "   a: add the given path as last"
  echo "   d: if found delete the given path"
  echo "   l: list all the searching path"
  echo "   ?: this screen"
}

function Display() {
  OLDIFS=$IFS
  IFS=":"
  WA=`echo $CSP`
  IFS=$OLDIFS
  K=0
  for path in $WA
    do
      K=`expr $K + 1`
      echo "[$K]=$path"
    done
}

if [ $# -eq 0 ]
  then
    Help;
    exit 2
fi

BASH_PROFILE="$HOME/.bash_profile"
CSP=$PATH
CHG=1
if [ `echo $1 | egrep -e "-"` ] > /dev/null
  then
    ACTION=`echo $1 | sed "s/-//"`
    case $ACTION in
      a) if [ -n "$2" ]
             then
               CSP="$2:$CSP" ;
               CHG=0 ;
	       Display
	   fi ;;
      i) if [ -n "$2" ]
             then
               CSP="$CSP:$2" ;
               CHG=0 ;
	       Display
	   fi ;;
      d) if [ `echo $CSP | grep -e "^$2:"` ] > /dev/null
           then
	     CSP=`echo $CSP | sed -e "s|^$2:||"` ;
         elif [ `echo $CSP | grep -e ":$2:"` ] > /dev/null
           then
             CSP=`echo $CSP | sed -e "s|:$2:|:|"` ;
	   else
	     CSP=`echo $CSP | sed -e "s|:$2|:|"` ;
	 fi
         CHG=0 ;
         Display ;;
      l) Display ;;
      ?) Help ;;
      *) echo "illegal command" ;;
    esac
  else
    echo "no action given"
    exit 1
fi
if [ $CHG -eq 0 ]
  then
    echo -n "Do you want to use the new search path? (y/n) "
    read YES
    if [ "$YES" == "y" ]
      then
        PATTERN="PATH=$CSP"
	sed -e "s/^PATH/PATH=\n#PATH/" $BASH_PROFILE >> tmp$$;
        sed -e "s|^PATH=|$PATTERN|" tmp$$ > $BASH_PROFILE;
      	/bin/rm -f tmp$$;
        echo "done"
	export PATH
	exec /bin/bash -l
    fi
fi
exit 0

Gestione della Variabile PATH

Si osservi che per rendere effettive le modifiche apportate alla suddetta variabile PATH è necessario ritornare alla shell "sostituendo l'esecuzione di path con quella della shell con la modalità di login".

L'Agenda Telefonica Rivisitata

Nella precedente lezione si è visto come realizzare il passaggio dei parametri dalla pagina HTML alla shell che attiva lo script CGI che esegue l'azione richiesta dalla pagina HTML. Si osserva che tale indicizzazione è ottenuta mediante l'attributo action associato al tag form.

Il meccanismo con il quale la shell accede ai suddetti parametri è realizzato introducendo alcune variabili di shell che sono: