11.07.2015 Views

Amministrare GNU/Linux - Cia

Amministrare GNU/Linux - Cia

Amministrare GNU/Linux - Cia

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

68 CAPITOLO 2. LA SHELL E I COMANDIquella elementare illustrata in sez. 2.1.3. Una sintassi e delle istruzioni che, per quanto sianoutilizzabili in teoria anche sulla riga di comando, sono generalmente poco usate in quanto menoindicate ad un uso interattivo, o dipendenti da funzionalità specifiche degli script.Una prima sintassi è quella che permette di eseguire più comandi distinti sulla stessa linea;questo può essere fatto in tre modi diversi. La prima modalità prevede che i singoli comandisiano separati fra di loro tramite il carattere “;”, in tal caso si tratta semplicemente di scriverequello che altrimenti si scriverebbe su linee diverse su una riga unica, usando il “;” per indicarela fine di un comando e l’inizio del successivo: in questo caso essi saranno eseguiti in sequenzada destra a sinistra come al posto del “;” si fosse premuto invio. In realtà questo è di scarsautilità sulla linea di comando (se non per eseguire più comandi in sequenza senza dover stare adattendere che ciascuno di essi finisca per lanciare il successivo) ma è utile negli script dove alcunidirettive di programmazione (come i condizionali) usano come parametro una linea di comando,la cui terminazione può essere resa esplicita con questo metodo. 32La seconda modalità è quella in cui i comandi che si vogliono eseguire vengono separatidall’operatore “&&”, che assume il significato di AND logico. In questo caso il comando successivoall’operatore verrà eseguito solo se il precedente non ha avuto errori. In caso di errori la catenaviene immediatamente interrotta. Questo consente allora di eseguire un secondo comando solose il primo ha avuto successo; in genere lo si usa per verificare se un certo file esiste e poi eseguireun comando.La terza modalità prevede che i diversi comandi sulla stessa linea vengano separati dall’operatore“||”, che invece assume il significato di OR logico. In questo caso si avrà che il comandosuccessivo all’operatore verrà eseguito soltanto se il precedente ha fallito. Questo consente dieseguire in alternativa due comandi; in genere lo si usa per eseguire le operazioni da effettuaresolo in caso di errori.Queste due ultime modalità fanno riferimento, per stabilire se un comando ha avuto o menosuccesso, ad una caratteristica comune di tutti i programmi che una volta eseguiti riportano(nel caso specifico alla shell che li ha lanciati) uno stato di uscita che serve ad indicare sele operazioni sono state concluse correttamente. La convenzione è che un valore nullo (cioè0) significa il successo dell’operazione, mentre un valore non nullo (in genere 1) indica chec’è stato un errore. Inoltre se il programma non si è concluso spontaneamente ma è statointerrotto da un segnale la shell assegna al codice di uscita il valore di 128 + n, dove n è ilnumero del segnale (ed ovviamente il comando viene considerato fallito). È con un controlloautomatico su questi valori che vengono prese le rispettive decisioni nell’uso dei operatori “&&”e “||” quando la shell concatena dei comandi. È inoltre da specificare che qualora invece siconcatenino dei comandi senza condizionali con l’uso del “;” verrà riportato il codice di uscitadell’ultimo comando eseguito.La presenza di un codice di uscita è molto importante, specie per gli script che possono usarequesta informazione per capire se ci sono stati problemi. Per questo la shell, nel ricevere lo statodi uscita di un comando, lo memorizza nella variabile speciale “?”, così che per un comandosuccessivo o all’interno di uno script è possibile ricavare lo stato di uscita dell’ultimo comandoeseguito in precedenza accedendo a quest’ultima. Allora potremo verificare che:piccardi@anarres:~/Truelite/documentazione$ lsCVS README corso internet-server lucidi sambapiccardi@anarres:~/Truelite/documentazione$ echo $?0piccardi@anarres:~/Truelite/documentazione$ ls licidils: licidi: No such file or directorypiccardi@anarres:~/Truelite/documentazione$ echo $?132èad esempio il costrutto usato nel condizionale presente nell’esempio di /etc/profile illustrato più avanti.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!