Capitolo 33. Miscellanea

 

Nobody really knows what the Bourne shell's grammar is. Even examination of the source code is little help.

 Tom Duff
Sommario
33.1. Shell e script interattivi e non
33.2. Shell wrapper
33.3. Verifiche e confronti: alternative
33.4. Ricorsività
33.5. "Colorare" con gli script
33.6. Ottimizzazioni
33.7. Argomenti vari
33.8. Sicurezza
33.9. Portabilità
33.10. Lo scripting di shell in Windows

33.1. Shell e script interattivi e non

Una shell interattiva legge i comandi dall'input dell'utente, immessi da una tty. Una tale shell, in modo predefinito, legge i file di avvio in fase di attivazione, visualizza un prompt e abilita il controllo dei job, tra le altre cose. L'utente può interagire con la shell.

Una shell che esegue uno script è sempre una shell non interattiva. Tuttavia, lo script può ancora accedere alla sua tty. È anche possibile simulare, nello script, una shell interattiva.

#!/bin/bash
MIO_PROMPT='$ '
while :
do
  echo -n "$MIO_PROMPT"
  read riga
  eval "$riga"
  done

exit 0

#  Questo script d'esempio e gran parte della spiegazione precedente
#+ sono stati forniti da Stéphane Chazelas (grazie ancora).

Si considera come interattivo quello script che richiede l'input dall'utente, di solito per mezzo di enunciati read (vedi Esempio 14-3). La "realtà" , a dire il vero, è un po' meno semplice di così. Per il momento si assume che uno script interattivo sia quello connesso ad una tty, uno script che un utente ha invocato da console o da xterm.

Gli script init e di avvio sono, per forza di cose, non interattivi, perché devono essere eseguiti senza l'intervento umano. Allo stesso modo, non sono interattivi gli script che svolgono attività d'amministrazione e di manutenzione del sistema. Compiti invariabili e ripetitivi richiedono di essere svolti automaticamente per mezzo di script non interattivi.

Gli script non interattivi possono essere eseguiti in background, a differenza di quelli interattivi che si bloccano in attesa di un input che potrebbe non arrivare mai. Questa difficoltà può essere gestita con uno script expect o con l'inserimento di un here document che sono in grado di fornire l'input allo script interattivo in esecuzione in background. Nel caso più semplice, redirigendo un file per fornire l'input ad un enunciato read (read variabile <file). Questi particolari espedienti permettono che script con funzionalità non specifiche possano essere eseguiti sia in modalità interattiva che non.

Se uno script ha bisogno di verificare se è in esecuzione in una shell interattiva, basta semplicemente controllare se la variabile del prompt, $PS1, è impostata. (Se l'utente dev'essere pronto ad inserire un input allora lo script deve visualizzare un prompt.)

if [ -z $PS1 ] # nessun prompt?
then
  # non interattiva
  ...
else
  # interattiva
  ...
fi
Alternativamente, lo script può verificare la presenza dell'opzione "i" in $-.
case $- in
*i*)    # shell interattiva
;;
*)      # shell non interattiva
;;
# (Cortesia di "UNIX F.A.Q.," 1993)

Nota

È possibile forzare l'esecuzione degli script in modalità interattiva con l'opzione -i o con l'intestazione #!/bin/bash -i. Si faccia però attenzione che questo potrebbe causare un comportamento irregolare dello script o visualizzare messaggi d'errore anche quando non ve ne sono.