• Non ci sono risultati.

Gli script di shell

Nel documento Introduzione a Linux (pagine 149-152)

Capitolo 7.  Home sweet /home

7.2.  Il vostro ambiente testuale

7.2.5.  Gli script di shell

Uno script di shell è, come abbiamo visto negli esempi sulla configurazione della shell, un file 

testuale contenente dei comandi della shell. Quando tale file viene utilizzato come primo argomento 

non di opzione nell'invocare Bash, e non sono state inserite né l'opzione -c né -s, Bash legge ed 

esegue i comandi presi dal file e poi esce. Questo modo di operare crea una shell non interattiva. 

Quando Bash esegue uno script di shell, viene attribuito il parametro speciale  0 al nome del file 

piuttosto che il nome della shell, e i parametri posizionali (qualsiasi cosa che segua il nome dello 

script) vengono fissati sui restanti argomenti, se esistenti. Se invece non sono stati forniti argomenti 

aggiuntivi, i parametri posizionali restano indefiniti.

Uno script di shell può essere reso eseguibile usando il comando  chmod  per accendere il bit di 

esecuzione.  Quando  Bash  trova  tale file mentre  sta cercando  in  PATH  un comando,  apre  una 

sottoshell per eseguirlo. In altri termini, eseguire

nomefile ARGOMENTI

equivale all'esecuzione di

se “nomefile” è uno script di shell eseguibile. Tale sottoshell reinizializza se stessa in modo che il 

risultato è come se fosse stata invocata una nuova shell per interpretare lo script, con l'eccezione 

che   le   posizioni   dei   comandi   registrate   dalla   genitrice   (v.  hash  nelle   pagine   Info)   vengono 

mantenute dalla figlia.

Molte versioni  di UNIX  rendono  ciò parte  del meccanismo  di esecuzione  di un comando  del 

sistema operativo. Se la prima riga di uno script comincia con i due caratteri “#!”, il resto della riga 

specifica un interprete per il programma. Così potete indicare  bash,  awk,  perl  o qualche altro 

interprete o shell e scrivere il resto del file di script in quel linguaggio.

Gli   argomenti   per   l'interprete   consistono   in   un   singolo   argomento   opzionale   dopo   il   nome 

dell'interprete nella prima linea del file di script, seguito dal nome del file di script e poi dai 

rimanenti argomenti. Bash svolgerà questa azione nei sistemi operativi che non la gestiscono da 

loro stessi.

Spesso gli script di Bash iniziano con

#! /bin/bash

(supponendo che Bash sia stata installata in /bin), poiché ciò assicura che Bash verrà utilizzata per 

interpretare lo script, anche se eseguito sotto un'altra shell.

7.2.5.2. Alcuni semplici esempi

Uno script molto semplice consiste in un unico comando che saluta l'utente che lo esegue:

[jerry@nowhere ~] cat hello.sh #!/bin/bash

echo "Ciao $USER"

Di  fatto lo script  è costituito da un solo comando,  echo, che usa il  valore  ($) della variabile 

ambientale  USER  per stampare  una frase personalizzata con il nome dell'utente che fornisce il 

comando.

Un altro “monolinea”, impiegato per mostrare gli utenti connessi:

#!/bin/bash

who | cut d " " f 1 | sort u− − −

Qui di seguito c'è uno script formato da un numero maggiore di linee che utilizzo per eseguire 

copie di sicurezza di tutti i file in una directory. Per prima cosa lo script crea un elenco di tutti i file 

presenti nella directory corrente e lo mette nella variabile LIST. Poi imposta il nome della copia per 

ciascun file ed infine copia il file. Per ogni file viene stampato un messaggio:

tille:~> cat bin/makebackupfiles.sh #!/bin/bash

# make copies of all files in a directory LIST=`ls`

ORIG=$i DEST=$i.old cp $ORIG $DEST echo "copied $i" done

Inserendo solo una linea come mv * *.old non funziona, come noterete sperimentandola su un 

gruppo di file di prova. Un comando  echo  è stato aggiunto per mostrare dell'attività: esso torna 

normalmente utile quando uno script non funziona. Inseritene uno dopo ciascun passaggio dubbio e 

scoprirete l'errore in un attimo.

La directory /etc/rc.d/init.d contiene una quantità di esempi. Diamo un occhio a questo script che 

controlla il server immaginario  ICanSeeYou:

#!/bin/sh

# description: ICanSeeYou allows you to see networked people

# process name: ICanSeeYou

# pidfile: /var/run/ICanSeeYou/ICanSeeYou.pid # config: /etc/ICanSeeYou.cfg

# Source function library. . /etc/rc.d/init.d/functions

# See how (with which arguments) we were called. case "$1" in

start)

echo n "Starting ICanSeeYou: "− daemon ICanSeeYou

echo

touch /var/lock/subsys/ICanSeeYou ;;

stop)

echo n "Shutting down ICanSeeYou: "− killproc ICanSeeYou echo rm f /var/lock/subsys/ICanSeeYou− rm f /var/run/ICanSeeYou/ICanSeeYou.pid− ;; status) status ICanSeeYou ;; restart) $0 stop $0 start ;; *)

echo "Usage: $0 {start|stop|restart|status}" exit 1

esac

exit 0

Per prima cosa con il comando . (punto) viene caricato un gruppo di funzioni di shell, usate da quasi 

tutti gli script di shell in /etc/rc.d/init.d. Dopo viene dato un comando case che definisce 

quattro modi diversi di esecuzione dello script: un esempio potrebbe essere  IcanSeeYou start

La decisione su quale  case  eseguire dipende dalla lettura del primo argomento dello script con 

l'espressione $1.

con cui lo script restituisce un messaggio di errore. La lista dei case termina con l'istruzione esac. 

Nel case start il programma server viene avviato come demone e gli vengono assegnati un ID di 

processo e un lock. Nel case stop il processo server viene rintracciato e fermato con rimozione del 

lock e del PID. Opzioni, come quella daemon, e funzioni, come killproc, vengono definite nel 

file  /etc/rc.d/init.d/functions.   Questa   impostazione   è   specifica   delle   distribuzioni 

usate in questo esempio. Gli initscript del vostro sistema potrebbero usare altre funzioni, definite in 

altri file, o nemmeno una.

In caso di successo lo script restituisce un codice d'uscita 0 al processo genitore.

Questo script è un bell'esempio di impiego  delle funzioni, che rendono lo script  più facile da 

leggere e il lavoro viene svolto più velocemente. Osservate che esse usano sh invece di bash per 

essere utili ad un insieme più esteso di sistemi. In un sistema Linux invocare  bash come sh è la 

conseguenza della shell che gira in modalità compatibile POSIX.

Le pagine man di bash contengono maggiori informazioni circa le combinazioni di comandi, i cicli 

for e while e le espressioni regolari, come pure esempi. Un comprensibile corso di Bash, con 

esercizi,   destinato   ad   amministratori   di   sistema   e   utenti   avanzati,   è   disponibile   su 

http://tille.garrels.be/training/bash/, dalla stessa autrice di questa guida “Introduzione a Linux”. La 

descrizione   dettagliata   delle   caratteristiche   ed   applicazioni   di   Bash   si   trova   nella   guida   di 

riferimento Advanced Bash Scripting.

Nel documento Introduzione a Linux (pagine 149-152)