Escolar Documentos
Profissional Documentos
Cultura Documentos
Machtelt Garrels
Garrels BVBA <tille wants no spam _at_ garrels dot be>
Indice generale
Introduzione.........................................................................................................................................7 1. Perch questa guida?...................................................................................................................7 2. Chi dovrebbe leggere questo libro?............................................................................................7 3. Nuove versioni, traduzioni e dis onibilit!.................................................................................." #. Cronologia delle revisioni..........................................................................................................." $. Contributi....................................................................................................................................% &. 'iscontri....................................................................................................................................1( 7. In)or*azioni sui diritti..............................................................................................................1( ". +i cosa avete bisogno?.............................................................................................................1( %. Convenzioni utilizzate in questo docu*ento............................................................................11 1(. ,rganizzazione di questo docu*ento.....................................................................................11 Ca itolo 1. -ash e gli scri t di -ash .................................................................................................13 1.1. Co*uni rogra**i della shell..............................................................................................13 1.1.1. .unzioni generali di shell...............................................................................................13 1.1.2. /i i di shell.....................................................................................................................13 1.2. 0antaggi della -ourne 1gain 2hell........................................................................................1# 1.2.1. -ash 3 la shell 4N5.......................................................................................................1# 1.2.2. .unzionalit! riscontrabili solo in bash...........................................................................1$ 1.3. 6secuzione dei co*andi.........................................................................................................21 1.3.1. In generale......................................................................................................................21 1.3.2. Co*andi integrati della shell.........................................................................................22 1.3.3. 6secuzione di rogra**i da uno scri t.........................................................................22 1.#. Costruzione di blocchi...........................................................................................................23 1.#.1. Costruzione di blocchi di shell.......................................................................................23 1.$. 2vilu are buoni scri t .........................................................................................................2& 1.$.1. Pro riet! dei buoni scri t...............................................................................................2& 1.$.2. 2truttura..........................................................................................................................2& 1.$.3. /er*inologia..................................................................................................................2& 1.$.#. 5na arola su ordine e logica.........................................................................................27 1.$.$. 5n ese* io di scri t di -ash7 *iosiste*a.sh................................................................27 1.$.&. 6se* io di scri t init.....................................................................................................2% 1.&. 2o**ario...............................................................................................................................3( 1.7. 6sercizi...................................................................................................................................3( Ca itolo 2. 2crivere e correggere gli scri t.......................................................................................32 2.1. Creare ed avviare uno scri t..................................................................................................32 2.1.1. 2crittura e deno*inazione..............................................................................................32 2.1.2. scri t1.sh........................................................................................................................33 2.1.3. 6secuzione dello scri t...................................................................................................3$ 2.2. 8e basi degli scri t.................................................................................................................3& 2.2.1. 9uale shell eseguir! lo scri t?.......................................................................................3& 2.2.2. 1ggiungere co**enti....................................................................................................3& 2.3. Caccia agli errori negli scri t -ash........................................................................................37 2.3.1. Correzioni nell:intero scri t............................................................................................37 2.3.2. Correzione su arte;i dello scri t...................................................................................3" 2.#. 2o**ario...............................................................................................................................#( 2.$. 6sercizi...................................................................................................................................#( Ca itolo 3. 8:a*biente di -ash.........................................................................................................#2 3.1. .ile di inizializzazione della shell..........................................................................................#2 2
3.1.1. .ile di con)igurazione dell:intero siste*a......................................................................#2 3.1.2. I )ile di con)igurazione del singolo utente.....................................................................## 3.1.3. Ca*biare i )ile di con)igurazione...................................................................................#7 3.2. 0ariabili..................................................................................................................................#" 3.2.1. /i i di variabili...............................................................................................................#" 3.2.2. Creazione delle variabili................................................................................................$( 3.2.3. 6s ortare variabili..........................................................................................................$1 3.2.#. 0ariabili riservate...........................................................................................................$2 3.2.$. Para*etri s eciali..........................................................................................................$& 3.2.&. 'iciclo degli scri t con le variabili................................................................................$" 3.3. Caratteri tra gli a ici..............................................................................................................&( 3.3.1. Perch?...........................................................................................................................&( 3.3.2. Caratteri di esca e..........................................................................................................&( 3.3.3. 1 ici singoli...................................................................................................................&( 3.3.#. 1 ici do i.....................................................................................................................&( 3.3.$. 0irgolettatura 1N2I<C....................................................................................................&1 3.3.&. 8ocali.............................................................................................................................&1 3.#. 6s ansione della shell............................................................................................................&1 3.#.1. In generale......................................................................................................................&1 3.#.2. 6s ansione delle arentesi gra))e...................................................................................&2 3.#.3. 6s ansione della tilde....................................................................................................&2 3.#.#. I ara*etri della shell e l:es ansione delle variabili......................................................&3 3.#.$. 8a sostituzione dei co*andi...........................................................................................&# 3.#.&. 6s ansione arit*etica....................................................................................................&$ 3.#.7. 2ostituzione dei rocessi................................................................................................&& 3.#.". 2co* osizione delle arole...........................................................................................&7 3.#.%. 6s ansione del no*e dei )ile.........................................................................................&7 3.$. 1lias.......................................................................................................................................&" 3.$.1. Cosa sono gli alias?........................................................................................................&" 3.$.2. Creazione e ri*ozione degli alias..................................................................................&% 3.&. 5lteriori o zioni di -ash........................................................................................................7( 3.&.1. , zioni di visualizzazione.............................................................................................7( 3.&.2. , zioni di *odi)ica.......................................................................................................7( 3.7. 2o**ario...............................................................................................................................71 3.". 6sercizi...................................................................................................................................72 Ca itolo #. 8e es ressioni regolari....................................................................................................73 #.1. 6s ressioni regolari................................................................................................................73 #.1.1. Cosa sono le es ressioni regolari?.................................................................................73 #.1.2. I *etacaratteri delle es ressioni regolari........................................................................73 #.1.3. 6s ressioni regolari ele*entari contro estese................................................................7# #.2. 6se* i di utilizzo di gre ......................................................................................................7# #.2.1. Cos:3 gre ?.....................................................................................................................7# #.2.2. 4re e le es ressioni regolari.........................................................................................7$ #.3. Co* arazione dei *odelli utilizzando le )unzionalit! di -ash.............................................77 #.3.1. Intervalli dei caratteri.....................................................................................................77 #.3.2. Classi di caratteri............................................................................................................7" #.#. 2o**ario...............................................................................................................................7% #.$. 6sercizi...................................................................................................................................7% Ca itolo $. 8:editor di )lussi 4N5 sed.............................................................................................."( $.1. Introduzione..........................................................................................................................."( 3
$.1.1. Che cosa 3 sed................................................................................................................"( $.1.2. I co*andi di sed............................................................................................................."( $.2. =odi)ica interattiva................................................................................................................"1 $.2.1. 2ta* a delle linee contenenti un *odello....................................................................."1 $.2.2. Cancellazione delle linee in ingresso contenenti un *odello........................................"2 $.2.3. Intervalli di linee............................................................................................................"2 $.2.#. Cerca e sostituisci con sed............................................................................................."3 $.3. =odi)iche non interattive......................................................................................................."# $.3.1. 8ettura dei co*andi di sed da un )ile............................................................................."# $.3.2. 2crittura dei )ile dei dati in uscita.................................................................................."$ $.#. 2o**ario..............................................................................................................................."& $.$. 6sercizi..................................................................................................................................."& Ca itolo &. Il linguaggio di rogra**azione 4N5 a>?.................................................................."" &.1. Introduzione a ga>?..............................................................................................................."" &.1.1. Cos:3 ga>??...................................................................................................................."" &.1.2. I co*andi di ga>?.........................................................................................................."% &.2. Il rogra**a rint................................................................................................................."% &.2.1. 2ta* a di ca* i selezionati..........................................................................................."% &.2.2. .or*attare i ca* i.........................................................................................................%( &.2.3. Il co*ando rint e le es ressioni regolari......................................................................%1 &.2.#. =odelli s eciali..............................................................................................................%2 &.2.$. 4li scri t in ga>?...........................................................................................................%3 &.3. 8e variabili di ga>?...............................................................................................................%3 &.3.1. Il se aratore di ca* i i**essi.......................................................................................%3 &.3.2. I se aratori di e*issione................................................................................................%# &.3.3. Il nu*ero di record.........................................................................................................%$ &.3.#. 0ariabili de)inite dall:utente...........................................................................................%& &.3.$. 5lteriori ese* i..............................................................................................................%& &.3.&. Il rogra**a rint)........................................................................................................%7 &.#. 2o**ario...............................................................................................................................%7 &.$. 6sercizi...................................................................................................................................%" Ca itolo 7. Istruzioni condizionali..................................................................................................1(( 7.1. Introduzione a i)...................................................................................................................1(( 7.1.1. In generale....................................................................................................................1(( 7.1.2. 2e* lici a licazioni di i)...........................................................................................1(3 7.2. 5so di i) i@ avanzato..........................................................................................................1($ 7.2.1. Costrutti i);then;else.....................................................................................................1($ 7.2.2. I costrutti i);then;else...................................................................................................1(% 7.2.3. Istruzioni i) annidate.....................................................................................................11( 7.2.#. , erazioni booleane.....................................................................................................11( 7.2.$. 5so dell:istruzione eAit e i)...........................................................................................111 7.3. 5so delle istruzioni case......................................................................................................112 7.3.1. Condizioni se* li)icate................................................................................................112 7.3.2. 6se* io di initscri t.....................................................................................................113 7.#. 2o**ario.............................................................................................................................11# 7.$. 6sercizi.................................................................................................................................11# Ca itolo ". 2crivere scri t interattivi...............................................................................................11& ".1. Presentare dei *essaggi er gli utenti..................................................................................11& ".1.1. Interattivi o *eno?.......................................................................................................11& ".1.2. 5so del co*ando integrato echo..................................................................................117 #
".2. Cattura dell:i**issione dell:utente......................................................................................11% ".2.1. 5so del co*ando integrato read...................................................................................11% ".2.2. 'ichieste di i**issione dati dagli utenti.....................................................................12( ".2.3. 'edirezione e descrittori dei )ile..................................................................................122 ".2.#. I**issioni ed e*issioni di )ile....................................................................................12# ".3. 2o**ario.............................................................................................................................12% ".#. 6sercizi.................................................................................................................................12% Ca itolo %. Co* iti ri etitivi..........................................................................................................131 %.1. Il ciclo )or.............................................................................................................................131 %.1.1. Co*e )unziona?...........................................................................................................131 %.1.2. 6se* i..........................................................................................................................131 %.2. Il ciclo >hile........................................................................................................................133 %.2.1. Cos:3?...........................................................................................................................133 %.2.2. 6se* i..........................................................................................................................133 %.3. Il ciclo until..........................................................................................................................13& %.3.1. Cos:3?...........................................................................................................................13& %.3.2. 6se* io........................................................................................................................13& %.#. 8a redirezione dell:I;, e i cicli............................................................................................137 %.#.1. 'edirezione dell:i**issione........................................................................................137 %.#.2. 'edirezione dell:e*issione...........................................................................................137 %.$. -rea? e continue..................................................................................................................13" %.$.1. 8:integrato brea?..........................................................................................................13" %.$.2. 8:integrato continue......................................................................................................13% %.$.3. 6se* i..........................................................................................................................13% %.&. Creazione di *enu con l:integrato select.............................................................................1#( %.&.1. In generale....................................................................................................................1#( %.&.2. 2otto*enu....................................................................................................................1#2 %.7. 8:integrato shi)t....................................................................................................................1#2 %.7.1. Che cosa )a?.................................................................................................................1#2 %.7.2. 6se* i..........................................................................................................................1#2 %.". 2o**ario.............................................................................................................................1## %.%. 6sercizi.................................................................................................................................1## Ca itolo 1(. +i i@ sulle variabili...................................................................................................1#& 1(.1. /i i di variabili...................................................................................................................1#& 1(.1.1. 1ssegna*ento di valori in generale...........................................................................1#& 1(.1.2. 5so dell:integrato declare...........................................................................................1#& 1(.1.3. Costanti......................................................................................................................1#7 1(.2. 0ariabili *atriciali.............................................................................................................1#" 1(.2.1. Creazione delle *atrici..............................................................................................1#" 1(.2.2. +ere)erenzia*ento delle variabili di una *atrice......................................................1#% 1(.2.3. Cancellare le variabili *atriciali................................................................................1#% 1(.2.#. 6se* i di *atrici.......................................................................................................1$( 1(.3. , erazioni su variabili.......................................................................................................1$2 1(.3.1. 1rit*etica con le variabili..........................................................................................1$2 1(.3.2. 8unghezza di una variabile........................................................................................1$2 1(.3.3. /ras)or*azioni di variabili.........................................................................................1$2 1(.#. 2o**ario...........................................................................................................................1$$ 1(.$. 6sercizi...............................................................................................................................1$$ Ca itolo 11. .unzioni......................................................................................................................1$7 11.1. Introduzione.......................................................................................................................1$7 $
11.1.1. Cosa sono le )unzioni?...............................................................................................1$7 11.1.2. 2intassi delle )unzioni................................................................................................1$7 11.1.3. I ara*etri osizionali nelle )unzioni.........................................................................1$" 11.1.#. =ostrare le )unzioni...................................................................................................1$% 11.2. 6se* i di )unzioni negli scri t..........................................................................................1&( 11.2.1. 'iciclaggio.................................................................................................................1&( 11.2.2. I* ostazione del ercorso..........................................................................................1&( 11.2.3. Co ie di salvataggio in re*oto...................................................................................1&1 11.3. 2o**ario...........................................................................................................................1&2 11.#. 6sercizi...............................................................................................................................1&2 Ca itolo 12. Cattura dei segnali......................................................................................................1&# 12.1. 2egnali...............................................................................................................................1&# 12.1.1. Introduzione...............................................................................................................1&# 12.1.2. 5so dei segnali con ?ill..............................................................................................1&$ 12.2. /ra ole.............................................................................................................................1&& 12.2.1. In generale..................................................................................................................1&& 12.2.2. Co*e -ash inter reta le tra ole...............................................................................1&7 12.2.3. 5lteriori ese* i..........................................................................................................1&7 12.3. 2o**ario...........................................................................................................................1&" 12.#. 6sercizi...............................................................................................................................1&" 1 endice 1 . Caratteristiche della shell..........................................................................................17( 1.1. Caratteristiche co*uni........................................................................................................17( 1.2. Caratteristiche di))erenti......................................................................................................171 4lossario..........................................................................................................................................17# Indice...............................................................................................................................................1%#
&
Introduzione
1. Perch questa guida?
Il *otivo rinci ale er la scrittura di questo docu*ento 3 che *olti lettori avvertono che l:esistente B,C/, 3 tro o breve ed inco* leto B,C/,, *entre la guida -ash scri ting 3 eccessiva co*e o era di ri)eri*ento. Non esiste nulla tra i due estre*i. Bo scritto ure questa guida sul rinci io generale che non sono dis onibili abbastanza corsi ele*entari liberi, sebbene dovrebbe essere cosD. 9uesta 3 una guida ratica che, sebbene non se* re *olto seria, tenta di )ornire ese* i di vita reale iuttosto che teorici. In articolare l:ho scritta erch non *i a))ascinano ese* i ri resi ed eccessiva*ente se* li)icati, scritti da ersone che conoscono ciE di cui stanno arlando e che *ostrano alcune caratteristiche di -ash vera*ente carine e cosD )uori dal suo contesto che non otrete usare *ai in circostanze ratiche. Potrete leggere questo genere di argo*enti do o aver ter*inato questo libro, che contiene esercizi ed ese* i che vi aiuteranno a so ravvivere nel *ondo reale. +alla *ia es erienza di utente 5NIF;8inuA, a**inistratrice di siste*a e docente, so che la gente uE avere anni di interazione quotidiana con i ro ri siste*i, senza avere la *ini*a conoscenza di auto*azione dei co* iti. CosD ensano )requente*ente che 5NIF non sia alla ortata degli utenti e, ancora eggio, ricevono l:i* ressione che sia lento e )uori *oda. /ale roble*a 3 un altro a cui si otr! orre ri*edio con questa guida.
Introduzione
Per*essi, *odalit! s eciali Co* rendere le convenzioni dei no*i delle eri)eriche, il artiziona*ento, il *ontaggio e lo s*ontaggio dei )ile sGste* 1ggiungere;ri*uovere so)t>are nei vostri siste*i
Consultate Introduzione a 8inuA Ho il vostro *irror locale di /8+PI se non avete trattato uno o i@ di questi argo*enti. In)or*azioni aggiuntive si ossono trovare nella vostra docu*entazione di siste*a H agine *an e in)oI o nel Progetto di Documentazione Linux (The Linux Documentation ProjectI.
3.
8:edizione i@ recente si uE trovare su htt 7;;tille.garrels.be;training;bash;. Potreste trovare la stessa versione su htt 7;;tld .org;8+P;-ash<-eginners<4uide;ht*l;indeA.ht*l. 9uesta guida 3 dis onibile Jin ingleseK sta* ata resso .ultus.co*. Figura 1. La copertina anteriore di Bash Guide for beginners
9uesta guida 3 stata tradotta7 traduzione cinese di Cang Cei su htt 7;;Aiao>ang.net;bgb<cn; traduzione ucraina di Laroslav .edevGch ed il suo gru o su htt 7;;docs.linuA.org.ua;indeA. h ;8+P7-ashMbeginnersMguide 5na traduzione )rancese 3 in corso e verr! aggiunta ai collega*enti non a ena sar! ter*inata.
'evisione 1.11 /rattate le segnalazioni dei lettori. 'evisione 1.1( Ca*bio di indirizzi 'evisione 1.% 'evisione 1."
Incor orati i co**enti dei lettori, aggiunto indice utilizzando le etichette +oc-oo?. chiarito ese* io nel Ca itolo #, corretto doc here nel ca itolo %, veri)iche generali e correzione degli errori ti ogra)ici, aggiunti i collega*enti alle traduzioni cinese e ucraina, note ed altro da sa ere su a>? nel ca itolo &. 'evisione 1.7 Corretti errori ti ogra)ici nei ca itoli 3, & e 7, incor orati dei co**enti dei letttori, aggiunta una nota nel ca itolo 7. 'evisione 1.& Correzioni *inori, aggiunte i@ arole chiave, in)or*azioni su nuova -ash 3.(, tolta un:i**agine vuota. 'evisione 1.( 0ersione iniziale er 8+PN i@ esercizi, i@ *arcature, *eno errori e aggiunta del glossario 'evisione 1.(<beta Pre<rilascio
$. Contributi
4razie a tutti gli a*ici che hanno aiutato Ho hanno cercato di )arloI e a *io *arito7 le vostre arole di incoraggia*ento hanno reso ossibile questo lavoro. 4razie a tutte le ersone che hanno inviato segnalazioni di errori, ese* i e co**enti O di cui )ra gli altri tantissi*i7 Bans -ol, uno dei gru etti =i?e 2i*, co**enti sullo stile +an 'ichter, er gli ese* i sulle *atrici 4erg .erguson, er le idee sul titolo =endel 8eo Coo er, er aver )atto s azio PlinuA.be, er aver tenuto i *iei iedi a terra .ran? Cang, er i suoi dettagliati co**enti sulle cose che ho sbagliato a )are N<I 'ingrazia*enti s eciali a /abatha =arshall, che si 3 dedicata volonterosa*ente a svolgere una revisione ed un controllo ortogra)ico e gra**aticale co* leti. .or*ia*o una bella squadra7 lei lavora quando io dor*o. 6 viceversa N<I
Introduzione
%. &iscontri
In)or*azioni *ancanti, collega*enti assenti, caratteri sco* arsi, note? Inviateli a <tille non vuole spam _at_ garrels punto be> la *anutentrice di questo docu*ento.
8:autrice e l:editore hanno )atto ogni s)orzo nella re arazione di questo libro er assicurare l:accuratezza delle in)or*azioni. /uttavia le in)or*azioni contenute in questo libro sono o))erte senza garanzia, sia es ressa che tacita. N l:autrice, n l:editore o qualunque altro venditore o distributore saranno ritenuti res onsabili er qualsiasi danno causato o ritenuto causato sia diretta*ente che indiretta*ente da questo libro. I loghi, i *archi co**erciali e i si*boli utilizzati in questo libro sono ro riet! dei ris ettivi titolari.
Significato Citazione da ersone, risultato del co* uter tra virgolette. Ingresso ed uscita dati letterale del co* uter catturati dal ter*inale, solita*ente reso con uno s)ondo grigio chiaro. No*e di un co*ando che uE essere inserito nella riga di co*ando. No*e di una variabile o di un untatore ad un contenuto della variabile, co*e in $NOMEVAR. , zione di un co*ando, co*e in Ql:o zione -a del co*ando lsR. 1rgo*ento di un co*ando, co*e in Qleggete man lsR. sintassi dei co*andi od utilizzo in generale nella riga di co*ando No*e di un )ile o di una directorG, er ese* io QCa*biate verso la directorG /usr/binR, /asti da battere sulla tastiera, co*e Qbattete Q er ter*inareR. -ottone gra)ico da re*ere, co*e il bottone ,S. 2celta da e))ettuare in un *enu gra)ico, er ese* io Q2cegliete 4uida< TIn)or*azioni su =ozilla .ire)oA nel vostro navigatore di reteR. /er*ine o concetto i* ortante7 QIl kernel di 8inuA costituisce il cuore del siste*aR. 8a sbarra inversa in una vista di ter*inale o nella sintassi di un co*ando indica una riga non ter*inata. In altre arole, se vedete un co*ando lungo che 3 suddiviso in i@ righe, U signi)ica QNon re*ete ancora In ioVR. Collega*ento al relativo argo*ento contenuto in questa guida. Collega*ento cliccabile ad una risorsa di rete esterna.
comando VARIABILE opzione argomento comando opzioni argomenti nomefile Tasto -ottone =enu<T2celta Terminologia
U v. Ca itolo 1 8:autore
negli scri t di shell. I ca itoli dall:otto al dodici si occu ano dei i@ co*uni costrutti degli scri t di shell. /utti i ca itoli hanno degli esercizi che veri)icheranno la vostra re arazione er quelli successivi. Ca itolo 17 'udi*enti di -ash7 erch -ash 3 cosD valida, costruzione di blocchi, ri*e linee guida nello svilu o di buoni scri t. Ca itolo 27 'udi*enti di scri t7 scrittura e correzione. Ca itolo 37 8:a*biente di -ash7 )ile di inizializzazione, variabili, caratteri virgolettati, ordine di es ansione della shell, alias, o zioni. Ca itolo #7 6s ressioni regolari7 una introduzione. Ca itolo $7 2ed7 una introduzione all:editor di linea sed. Ca itolo &7 1>?7 introduzione al linguaggio di rogra**azione a>?. Ca itolo 77 Istruzioni condizionali7 costrutti usati in -ash er veri)icare le condizioni Ca itolo "7 2cri t interattivi7 creare se* lici scri t er catturare gli in ut degli utenti Ca itolo %7 6secuzione ri etuta di co*andi7 costrutti usati in -ash er auto*atizzare l:esecuzione dei co*andi. Ca itolo 1(7 0ariabili avanzate7 s eci)icare i ti i delle variabili, introduzione alle *atrici delle variabili, o erazioni su variabili. Ca itolo 117 .unzioni7 una introduzione. Ca itolo 127 Cattura dei segnali7 introduzione alle segnalazioni dei rocessi, segnali di cattura inviati dagli utenti.
Introduzione
12
)unzionano ure con bash. csh o C shell7 la sintassi di questa shell a quella del linguaggio di rogra**azione C. /alvolta ricercata dai rogra**atori. tcsh o /6N6F C shell7 un su erinsie*e della co*une C shell, con *igliora*enti nella )acilit! d:uso e nella velocit!. 9uesto 3il *otivo er cui qualcuno la chia*a /urbo C shell. !sh o Sorn shell7 talvolta a rezzata da ersone con es erienze 5NIF. 5n su erinsie*e della -ourne shell7 in con)igurazione standard un incubo er gli utenti rinci ianti. Il )ile /etc/shells o))re una anora*ica delle shell conosciute in un siste*a 8inuA7
mia:~> cat /etc/shells /bin/bash /bin/sh /bin/tcsh /bin/csh
8a vostra shell rede)inita 3 i* ostata nel )ile /etc/passwd, co*e in questa linea dell:utente mia7
mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash
Per assare da una shell all:altra basta inserire il no*e della nuova shell nel ter*inale attivo. Il siste*a trova la directorG dove ricorre il no*e utilizzando le i* ostazioni di PATH e, dal *o*ento che la shell 3 un )ile eseguibile H rogra**aI, l:attuale shell l:attiva ed essa viene eseguita. Nor*al*ente viene *ostrato un nuovo invito J promptK oich ogni shell ha la ro ria ti ica a arenza7 mia:~> tcsh [mia@post21 ~]$
1.2.2.2.1.
Interattivo signi)ica che otete inviare dei co*andi. 8a shell non sta )unzionando erch uno scri t 3 stato attivato. 5na shell di login signi)ica che avete una shell do o l:autenticazione nel siste*a, nor*al*ente dando il vostro no*e utente e la ass>ord. .ile letti7 /etc/profile ~/.bash_profile, ~/.bash_login o esistente ure ~/.profile7 viene letto il ri*o )ile
~/.bash_logout alla chiusura della sessione JlogoutK 0engono e*essi dei *essaggi di errore se i )ile di con)igurazione esistono *a non sono leggibili. 2e un )ile non esiste, bash cerca il successivo.
1.2.2.2.2.
2hell non di login signi)ica che non dovete autenticarvi nel siste*a. Per ese* io, quando a rite un ter*inale usando una icona o una voce di *enu, questa 3 una shell non di login. .ile letti7
1$
~/.bashrc 9uesto )ile nor*al*ente si ri)erisce a ~/.bash_profile7 if " -f ~/.bashrc #$ then . ~/.bashrc$ fi 0. Ca itolo 7 er *aggiori in)or*azioni sul costrutto i).
1.2.2.2.3.
/utti gli scri t usano shell non interattive. 6ssi sono rogra**ati er svolgere certi co* iti e non ossono essere istruiti a svolgere altri lavori eccetto quelli er cui sono stati rogra**ati. .ile letti7 de)inito da BASH_ENV PATH non viene utilizzato er ricercare questo )ile, cosicch, se volete usarlo, *eglio ri)erirsi ad esso dando il ercorso ed il no*e co* leti.
1.2.2.2.#.
-ash cerca di co* ortarsi co*e lo storico rogra**a sh *entre aderisce il i@ ossibile allo standard P,2IF. .ile letti7 /etc/profile ~/.profile 9uando chia*ata interattiva*ente, la variabile ENV aggiuntive. uE untare ad in)or*azioni di avvio
1.2.2.2.$.
9odalit" P.3I:
9uesta o zione viene abilitata o usando il set integrato7 set -o posix o ure chia*ando il rogra**a bash con l:o zione Oposix. -ash tenter! quindi di attenersi il i@ ossibile allo standard P,2IF er le shell. 2i ottiene la stessa cosa i* ostando la variabile 1&
1.2.2.2.%.
Chia)ata da re)oto
File letti quando chiamata da rshd7 ~/.bashrc % itate l&uso di r'tools 2tate attenti ai ericoli (uando utilizzate stru*enti co*e rlogin, telnet, rsh e rcp7 sono intrinseca*ente insicuri oich i dati con)idenziali vengono inviati in chiaro sulla rete. 2e vi servono stru*enti er esecuzioni, tras)eri*ento )ile e cosD via in re*oto, utilizzate un:i* le*entazione di 2ecure 2hell, nota co*une*ente co*e 22B,dis onibile libera*ente su htt 7;;>>>.o enssh.org. 2ono dis onibili anche diversi rogra**i cliente er siste*i non 5NIF7 consultate il vostro *irror locale di so)t>are.
1.2.2.2.'.
5na shell interattiva general*ente legge da e scrive su ub ter*inale utente7 ingresso ed uscita dei dati sono collegati ad un ter*inale. Il co* orta*ento interattivo di -ash inizia quando il co*ando bash viene chia*ato senza argo*enti rivi di o zioni, eccetto quando l:o zione 3 una stringa da leggere nella shell o quando questa viene invocata er leggere dall:ingresso standard dei dati J tandard inputK che er*ette di i* ostare i ara*etri osizionali Hv. Ca itolo 3I.
1.2.2.3.2.
0eri)icate osservando il contenuto dello s eciale ara*etro -7 contiene una :i: quando la shell 3 interattiva. eddy:~> echo $himBH Ca itolo 1. -ash e gli scri t di -ash 17
1.2.2.3.3.
+i))erenze nella *odalit! interattiva7 -ash legge i )ile di avvio Controllo dei rocessi nor*al*ente abilitato 4li inviti sono de)initi, P22 3 abilitata er i co*andi *ultilinea, i* ostata di solito a QTR. 9uesto 3 anche l:invito che ottenete quando la shell ritiene che abbiate inserito un co*ando inco* leto, er ese* io quando scordate degli a ici, delle strutture dei co*andi che non ossono essere tralasciate, ecc... I co*andi vengono letti in *odo rede)inito dalla riga di co*ando utilizzando readline. -ash inter reta l:o zione di shell ignoreeof invece di uscire i**ediata*ente con la ricezione di 6,. H6nd ,) .ileI. 8a cronologia dei co*andi e l:es ansione della cronologia vengono abilitate in artenza. 8a cronologia viene salvata nel )ile untato da HISTFILE quando la shell ter*ina. In artenza, BI2/.I86 unta a ~/.bash_history. 6: abilitata l:es ansione degli alias. In assenza di tra ole, il segnale SIGTERM viene ignorato. In assenza di tra ole, il segnale SIGINT viene viene intercettato e gestito. 9uindi, er ese* io, battendo )trl*) non si interro* er! la vostra shell interattiva. 8:invio di segnali SIGHUP a tutti i rocessi viene con)igurato tra*ite l:o zione huponexit. I co*andi vengono eseguiti su lettura. -ash controlla eriodica*ente la osta. -ash uE essere con)igurata er ter*inare quando incontra variabili non re)erenziate. Nella *odalit! interattiva questo co* orta*ento 3 disabilitato. 9uando i co*andi integrati della shell incontrano errori di redirezione, ciE non deter*ina l:uscita della shell. Co*andi integrati s eciali che restituiscono errori in *odalit! P,2IF non deter*inano l:uscita della shell. 9uesti sono elencati nella 2ezione 1.3.2. Il )alli*ento di e+ec non )ar! uscire la shell. Il se* lice controllo ortogra)ico er gli argo*enti dell:integrato cd viene abilitato in artenza. 0iene abilitata l:uscita auto*atica do o la scadenza del eriodo s eci)icato nella variabile /=,5/. =aggiori in)or*azioni7 2ezione 3.2
1"
2ezione 3.& v. Ca itolo 12 er un di i@ sui segnali. 2ezione 3.# tratta le varie es ansioni eseguite con l:inseri*ento di un co*ando.
non ha alcun e))etto )inch non viene letta la successiva linea di ingresso. I co*andi che seguono la de)inizione dell:alias in quella linea non vengono in)luenzati dai nuovi alias. 4li alias vengono es ansi quando viene letta una de)inizione di )unzione,non quando viene eseguita la )unzione, erch una de)inizione di )unzione 3 di er s stessa un co*ando co* osto. +i conseguenza, gli alias de)initi in una )unzione non sono dis onibili solo do o che la )unzione 3 eseguita. +iscutere*o degli alias in dettaglio nella 2ezione 3.$.
1.2.2.'. Le )atrici
-ash )ornisce variabili di *atrici *onodi*ensionali. 9ualsiasi variabile uE essere usata co*e una *atriceN l:integrato declare dichiarer! es licita*ente una *atrice. Non esiste li*ite *assi*o della di*ensione di una *atrice e ne ure un qualche requisito che i *e*bri vengano indicizzati o assegnati in *odo contiguo. 8e *atrici artono dallo zero. 0. Ca itolo 1(.
1.2.2.,. L7invito
-ash rende se* re i@ divertente giocare con l:invito J promptK. 0. la 2ezione Controllare l"invito nelle agine in)o di -ash.
I no*i dei co*andi non ossono i@ contenere barre. I no*i dei )ile contenenti una barra non sono i@ consentiti con il co*ando integrato . HsorgenteI. 8:hash integrato non accetta barre con l:o zione -p. 8:i* ortazione di )unzioni all:avvio 3 disabilitata. SHELLOPTS viene ignorata all:avvio. 8a redirezione in uscita utilizzando >, TX, ><, >&, &> e >> 3 disabilitata. 8:integrato e+ec 3 disabilitato. 8e o zioni <) e <d sono disabilitate er l:integrato enable. 5n P1/B base non uE essere s eci)icato tra*ite l:integrato command. Non 3 ossibile s egnere il *odo ristretto. 9uando viene eseguito un co*ando che si sco re essere uno scri t, rbash esclude qualsiasi restrizione rodotta er eseguire lo scri t. 5lteriori in)or*azioni7 2ezione 3.2 2ezione 3.& In)o bash<T-asic 2hell .eatures<T'edirections 2ezione ".2.37 redirezione avanzata
boot trapping.
integrati della -ourne 2hell7 ,, ., brea!, cd, continue, e al, e+ec, e+it, e+port, getopts, hash, p-d, readonl., return, set, shift, test, ", times, trap, umas! e unset. Co*andi integrati di -ash7 alias, bind, builtin, command, declare, echo, enable, help, let, local, logout/ printf, read, shopt, t.pe, t.peset, ulimit e unalias. Co*andi integrati s eciali7 9uando -ash viene eseguito in *odalit! P,2IF, gli integrati s eciali di))eriscono dagli altri co*andi integrati er tre *otivi7 1. 4li integrati s eciali si trovano ri*a delle )unzioni di shell durante la ricerca dei co*andi Jcomand lookupK. 2. se un integrato s eciale restituisce uno stato di errore, una shell non interattiva ter*ina. 3. 8e istruzioni di assegna*ento che recedono il co*ando hanno e))etto nell:a*biente della shell do o il co* leta*ento del co*ando. 4li integrati s eciali P,2IF sono7 ., brea!, continue, e al, e+ec, e+it, e+port, readonl., return, set, shift, trap e unset. =olti di questi integrati verranno trattati nei rossi*i ca itoli. Per quei co*andi esclusi , )accia*o ri)eri*ento alle agine In)o.
22
=entre la sottoshell elabora ogni linea dello scri t, la shell genitrice as etta che il rocesso )iglio ter*ini. 9uando non ci sono i@ linee da leggere nello scri t di shell, la sottoshell ter*ina. 8a shell genitrice si risveglia e *ostra un nuovo invito.
1.#.1.2. Co)andi della shell 5n banale co*ando di shell co*e touch file1 file2 file3 consiste nel co*ando stesso seguito da argo*enti, se arati da s azi. Co*andi di shell i@ co* licati sono )or*ati da se* lici co*andi co*binati assie*e in svariate *odalit!7 in una conduttura HpipelineI in cui il risultato di un co*ando diventa il dato in ingresso di un secondo, in un costrutto iterattivo o condizionale, o in qualche altro raggru a*ento. 5na co ia di ese* i7 ls 0 more gun1ip file.tar.gz 0 tar xvf -
23
1.#.1.3. /unzioni della shell 8e )unzioni della shell sono un *odo er raggru are co*andi er un:esecuzione successiva utilizzando un solo no*e er il gru o. 0engono eseguiti ro rio co*e un co*ando QregolareR. 9uando il no*e di una )unzione di shell 3 utilizzato co*e un se* lice no*e di co*ando, viene eseguito l:elenco dei co*andi associati con tale )unzione. 8e )unzioni della shell vengono eseguite nel contesto della shell corrente7 nessun nuovo rocesso 3 creato er inter retarle. 8e )unzioni sono s iegate nel Ca itolo 11.
1.#.1.#. Para)etri della shell 5n ara*etro 3 un:entit! che contiene valori. PuE essere un no*e, un nu*ero o un valore s eciale. Per quanto riguarda la shell, una variabile 3 un ara*etro che conserva un no*e. 5na variabile ha un valore e zero o i@ attributi. 8e variabili si creano con il co*ando integrato alla shell declare. 2e non 3 stato dato un valore, alla variabile viene assegnata una stringa vuota. 8e variabili ossono essere eli*inate solo con l:integrato unset. 8:assegna*ento alle variabili 3 trattato nella 2ezione 3.2, *entre l:uso avanzato delle variabili nel Ca itolo 1(.
1.#.1.$. ;spansione della shell 8:es ansione della shell viene attuata do o che ciascuna linea di co*ando 3 stata divisa in )ra**enti. 9ueste sono le es ansioni eseguite7 6s ansione delle arentesi 6s ansione della tilde 6s ansione dei ara*etri e delle variabili 2ostituzione dei co*andi 6s ansione arit*etica 2uddivisione delle arole 6s ansione del no*e dei )ile +iscutere*o in dettaglio di questi ti i di es ansione nella 2ezione 3.#.
2#
1.#.1.%. &edirezioni
Pri*a dell:esecuzione di un co*ando, i suoi dati in ingresso ed uscita otrebbero essere rediretti utilizzando una s eciale notazione inter retata dalla shell. 8a redirezione uE essere usata anche er a rire e chiudere )ile del corrente a*biente di esecuzione della shell.
se il co*ando non 3 stato iniziato in *odo asincrono, la shell as etta il co*ando er co* letare e raccogliere il suo stato di uscita.
2$
5no scri t dovrebbe girare senza errori. +ovrebbe eseguire il co* ito a cui 3 destinato. 8a logica del rogra**a 3 chiara*ente de)inita e visibile. 5no scri t non svolge necessaria*ente un lavoro. 4li scri t dovrebbero essere riutilizzabili.
1.$.2. 3truttura
8a struttura di una scri t di shell 3 *olto )lessibile. 1nche se in -ash viene garantita *olta libert!, voi dovete assicurare una logica corretta, un controllo dei )lussi e l:e))icienza, cosicch gli utenti che )anno )unzionare lo scri t lo ossano )are in *odo )acile e corretto. 1ll:inizio di un nuovo scri t, onetevi le seguenti do*ande7 1vrE bisogno di qualche in)or*azione dall:utente o dall:a*biente dell:utente? co*e conserverE queste in)or*azioni? c:3 qualche )ile che deve essere creato? dove e con quali er*essi e ro riet!? quali co*andi utilizzerE? quando si usa lo scri t in diversi siste*i, tutti questi siste*i avranno tali co*andi nelle versioni richieste? all:utente serve una qualche noti)ica? quando e erch?
1.$.3. 0er)inologia
8a tabella successiva ci o))re una anora*ica dei ter*ini di rogra**azione che vi occorrono er )a*iliarizzare con7 Tabella 1#1: Panoramica ui termini della programmazione Termine Ciclo JloopK Controllo dei co*andi Jcommand controlK )os&45 Porzione di rogra**a che viene eseguita zero o i@ volte. 2tato di uscita di rova er deter*inare se una arte del rogra**a debba essere eseguita.
2&
.lusso logico Jlogic flo$K Inseri*ento da utente Ju er inputK 2alto condizionale Jconditional branchK
8a struttura generale del rogra**a. +eter*ina la sequenza logica dei co* iti in *odo che il risultato sia corretto e controllato. In)or*azione )ornita da una )onte esterna *entre il rogra**a 3 in esecuzione7 uE essere conservata e richia*ata quando serve. Punto logico del rogra**a in cui unna condizione deter*ina cosa avviene do o.
5no scri t inizia se* re con gli stessi due caratteri, QPVR. +o o di ciE, 3 de)inita la shell che eseguir! i co*andi susseguenti la ri*a linea. 9uesto scri t inizia alla linea 2 con la ri ulitura dello scher*o. 8a linea 3 )a sD che sta* i un *essaggio in)or*ante l:utente su cosa sta er avvenire. 8a linea $ saluta l:utente. 8e linee &, %, 13, 1& e 2( si trovano l! solo a sco o di *ostrare i risultati in *odo ordinato. 8a linea " sta* a la data attuale ed il nu*ero della setti*ana. 8a linea 11 3 nuova*ente un *essaggio in)or*ativo co*e le linee 3, 1" e 22. 8a linea 12 )or*atta il risultato di -N la linea 1$ *ostra le in)or*azioni sul siste*a o erativo e la CP5. 8a linea 1% o))re le in)or*azioni di u ti*e e del carico. 2ia echo che printf sono dei co*andi -ash integrati. Il ri*o esce se* re con uno stato ( e sta* a se* lice*ente argo*enti seguiti da un carattere di )ine linea J %nd &f Line o 6,8K, *entre il successivo er*ette di de)inire una stringa di )or*attazione e d! in caso di )alli*ento un codice di stato di uscita diverso da zero. 9uesto 3 lo stesso scri t che utilizza l:integrato printf7
tom:~> cat -n miosistema.sh #!/bin/bash clear printf "Queste sono informazioni sono fornite da miosistema.sh. Il programma inizia ora.\n" printf "Ciao, $USER\n\n" printf "La data odierna `date`, questa la settimana n. `date +"%V"`.\n\n" printf "Questi sono gli utenti attualmente collegati:\n" w | cut -d " " -f 1 - | grep -v USER | sort -u printf "\n" printf "Questo `uname -s` che gira in un processore `uname -m`.\n\n" printf "Questa l'informazione di uptime:\n"
2"
8a creazione di scri t di )acile uso grazie all:inseri*ento di *essaggi viene trattata nel Ca itolo ". 6osi1ione standard della Bourne 7gain shell CiE i* lica che il rogra**a bash sia installato in ;bin. Se non 4 disponibile stdout 2e eseguite uno scri t da cron, )ornite i no*i dei ercorsi interi e ridirigete dati in uscita ed errori. 2icco*e la shell gira in *odo non interattivo,qualsiasi errore otrebbe deter*inare l:uscita re*atura dello scri t se non ensate a ciE. I ca itoli seguenti tratteranno i dettagli degli scri t qui so ra.
2%
esac exit 0
8:istruzione case, s esso utilizzata in questo ti o di scri t, 3 descritta nella 2ezione 7.2.$.
1.%. 3o))ario
-ash 3 la shell 4N5, co* atibile con la shell -ourne e incor orante *olte )unzioni utili di altre shell. 9uando viene avviata, la shell legge i suoi )ile di con)igurazione. I i@ i* ortanti sono7 /etc/profile ~/.bash_profile ~/.bashrc -ash si co* orta in *odo diverso quando 3 in *odalit! interattiva ed ha ure una *odalit! con)or*e e ristretta a P,2IF. I co*andi di shell ossono essere suddivisi in tre gru i7 le )unzioni di shell, gli integrati della shell e i co*andi esistenti in una directorG nel vostro siste*a. -ash su orta degli integrati aggiuntivi che non si trovano nella nor*ale shell -ourne. 4li scri t di shell consistono di tali co*andi organizzati co*e co*anda la sintassi della shell. 4li scri t vengono letti ed eseguiti linea er linea e dovrebbero avere una struttura logica.
1.'. ;sercizi
9uesti sono alcuni esercizi er re ararvi al rossi*o ca itolo. 1. +ov:3 osizionato il rogra**a bash nel vostro siste*a? 2. 5tilizzate l:o zione versione er sco rire quale versione state )acendo girare. 3. 9uali )ile di con)igurazione di shell vengono letti quando vi autenticate nel siste*a usando l:inter)accia gra)ica dell:utente H45I o 'raphical ( er )nterfaceI e quando a rite una )inestra di ter*inale? #. 8e seguenti shell sono shell interattive? 2ono shell di login? 5na shell a erta cliccando sullo s)ondo della vostra scrivania gra)ica, selezionando Q/er*inalR o qualcosa di si*ile da un *enu. 5na shell che ottenete do o aver dato il co*ando ssh localhost. 5na shell che ottenete quando vi autenticate nella console in *odalit! testo. 5na shell ottenuta con il co*ando +term 8. 5na shell a erta dallo scri t miosistema.sh. 5na shell che ottenete su un host re*oto, er la quale non dovete autenticarvi e;o dare la ass>ord erch utilizzate 22B e )orse le chiavi 22B. $. Potete s iegare erch bash non esce quando battete )trl*) nella riga di co*ando? &. =ostrate il contenuto della catasta H tackI delle directorG. 7. 2e non 3 ancora il caso, i* ostate il vostro invito in *odo che *ostri la vostra osizione nella gerarchia del siste*a. Per ese* io, aggiungete questa linea a ~/.bashrc7 Ca itolo 1. -ash e gli scri t di -ash 3(
e+port PS1="\u@\h \w> " ". =ostrate i co*andi con il cancelletto HPI della vostra corrente sessione di shell. %. 9uanti rocessi stanno girando attual*ente nel vostro siste*a? 5sate ps e -c7 la ri*a linea di dati in uscita di ps non 3 un rocessoV 1(. Co*e si *ostra il no*e host del siste*a? 2olo il no*e, nient:altroV
31
,s.n enable Potete aggiungere questa i* ostazione al vostro )ile .vimrc er renderla er*anente. Ca itolo 2. 2crivere e correggere gli scri t 32
=ettete i co*andi 5NIF nel )ile nuovo vuoto co*e li inserireste nella linea di co*ando. Co*e trattato nel ca itolo recedente Hv. 2ezione 1.3I, i co*andi ossono essere delle )unzioni di shell, degli integrati di shell, dei co*andi 5NIF e altri scri t. 1ttribuite al vostro scri t un no*e con)acente che suggerisca ciE che lo scri t roduce. 1ccertatevi che il no*e dello scri t non con)ligga con co*andi esistenti. Per assicurarvi che non si ossa creare con)usione, i no*i degli scri t s esso ter*inano in .sh7 anche cosD, ci otrebbero essere altri scri t nel vostro siste*a con lo stesso no*e di quello che avete scelto. 0eri)icate usando -hich, -hereis e altri co*andi er la ricerca di in)or*azioni su rogra**i e )ile7 -hich -a script_name -hereis script_name locate script_name
2.1.2. script1.sh
In questo ese* io usia*o l:integrato di -ash echo er in)or*are l:utente su cosa sta er avvenire, ri*a che venga eseguito il co* ito che creer! il risultato. 2i consiglia viva*ente di in)or*are gli utenti su cosa sta )acendo uno scri t, er evitare che si innervosiscano perch* lo cript non ta facendo niente. 'itornere*o sull:argo*ento della co*unicazione con gli utenti nel Ca itolo ".
33
-igura .#1/ cript1/ h 2crivete questo scri t da voi stessi co*e *eglio otete. Potrebbe essere una buona idea creare una directorG ~/scripts er tenere i vostri scri t. 1ggiungete la directorG ai contenuti della variabile PATH7 e+port PATH="$PATH:~/scripts" 2e state a ena inco*inciando con -ash, utilizzate un editor testuale che usi colori di))erenti er di))erenti costrutti di shell. 8:evidenziazione della sintassi 3 su ortata da im, g im, 9+:emacs, !-rite e *olti altri editor7 controllate la docu*entazione del vostro editor re)erito. In iti differenti 4li inviti HpromptI in questo corso ossono variare in base allo s irito dell:autore. CiE si accosta i@ alle situazione della vita reale iuttosto del tradizionale educativo invito +. 8:unica convenzione a cui ci attenia*o 3 che l:invito di root ter*ina con un segno cancelletto H, o ha h markI.
3#
9uesto 3 il *odo i@ co*une er eseguire uno scri t. 6: re)eribile eseguire uno scri t co*e questo in una sottoshell. 8e variabili, )unzioni ed alias creati in questa sottoshell sono noti solo alla articolare sessione di bash di tale sottoshell. 9uando quella shell ter*ina e la genitrice riacquista il controllo, tutto viene ri ulito e ed ogni *odi)ica di stato di shell eseguita dallo scri t viene di*enticata. 2e non *ettete la directorG scripts nel vostro PATH e . Hla directorG correnteI non 3 ne ure nel P1/B, otete attivare lo scri t in questo *odo7 .;nome<script.sh 5no scri t uE essere eseguito es licita*ente da una data shell, *a in genere )accia*o questo se voglia*o ottenere un co* orta*ento s eciale, co*e ad ese* io controllare se lo scri t )unziona con un:altra shell o sta* are le tracce er la ricerca degli errori7 rbash nome_script.sh sh nome_script.sh bash -x nome_script.sh 8a shell s eci)icata artir! co*e sottoshell di quella corrente ed eseguir! lo scri t. 9uesto 3 )atto desiderate che lo scri t si avvii con s eci)iche o zioni o sotto s eci)iche condizioni non recisate nello scri t.
3$
2e non volete avviare una nuova shell *a eseguire lo scri t in quella corrente, dovete usare ource con esso7 source nome_script.sh source = . 8:integrato di -ash source 3 un sinoni*o del co*ando . H untoI della shell -ourne. 8o scri t non ha bisogno in questo caso del er*esso di esecuzione. I co*andi vengono eseguiti nel contesto della attuale shell, cosicch ogni *odi)ica a ortata al vostro a*biente sar! visibile al ter*ine dell:esecuzione dello scri t7
willy:~/scripts> source script1.sh --output ommitted-willy:~/scripts> echo $VALUE 9 willy:~/scripts>
=olti utenti ed a**inistratori di siste*a )anno girare scri t che sono stati scritti da altre ersone. 2e essi vogliono vedere co*e l:avete realizzato, i co**enti sono utili er illu*inare il lettore. I co**enti rendono ure i@ se* lice la vostra vita. +ite che avete dovuto leggere un *ucchio di agine *an er raggiungere un articolare risultato con qualche co*ando utilizzato nel vostro scri t. Potreste non ricordare i@ co*e )unzionava se avete necessit! di *odi)icare il vostro scri t do o oche setti*ane o *esi, a *eno che non abbiate co**entato cosa, co*e e;o erch lo avete )atto. Prendete l:ese* io script1.sh e co iatelo co*e script1-commentato.sh, che *odi)ichia*o in *odo che i co**enti ris ecchino ciE che )a lo scri t. /utto ciE che la shell incontra in una linea do o un segno di cancelletto viene ignorato ed 3 visibile solo con l:a ertura del )ile dello scri t di shell7
#!/bin/bash # Questo script pulisce il terminal2, mostra un saluto e fornisce informazioni # sugli utenti attualmente connessi. Le due variabili d'esempio vengono # impostate e mostrate. clear # pulisce la finestra di terminale
echo "Lo script inizia adesso." echo "Ciao, $USER!" # Il segno dollaro si usa per ottenere il contenuto di una variabile echo echo "Ora ti invio un elenco degli utenti connessi:" echo w # mostra chi collegato e echo # cosa sta facendo echo "Adesso sto impostando due variabili." COLORE="nero" # imposta una variabile locale di VALORE="9" # imposta una variabile locale di echo "Questa una stringa: $COLORE" # mostra il contenuto della echo "E questo un numero: $VALORE" # mostra il contenuto della echo echo "Ora ti restituisco l'invito." echo
In uno scri t decente,le ri*e righe sono nor*al*ente dei co**enti su ciE che ci as etta. Poi ciascun grosso ezzo di co*andi verr! co**entato secondo necessita er ragioni di chiarezza. 4li scri t init di 8inuA, er ese* io, nella vostra directorG di siste*a init.d, di solito sono ben co**entati dal *o*ento che devono essere leggibili e *odi)icabili da chiunque )accia )unzionare 8inuA.
avviare la sottoshell con l:o zione <A, che )ar! girare lo scri t intero in *odalit! correzione H debug modeI. Il traccia*ento di ogni co*ando i@ i suoi argo*enti vengono sta* ati nella eri)erica rede)inita er l:e*issione dei dati H tandard outputI do o che i co*andi sono stati es ansi *a ri*a della loro esecuzione. 9uesto 3 lo scri t script1-commentato.sh )atto girare in *odalit! correzione. Notate nuova*ente che i co**enti aggiunti non sono visibili nei risultati dello scri t.
willy:~/scripts> bash -x ./script1.sh + clear
+ echo 'Lo script inizia adesso.' Lo script inizia adesso. + echo 'Ciao, willy!' Ciao, willy! + echo + echo 'Ora ti invio un elenco degli utenti connessi:' Ora ti invio un elenco degli utenti connessi: + echo + w 4:50pm up 18 days, 6:49, 4 users, load average: 0.58, 0.62, 0.40 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 Sat 2pm 5:36m 0.24s 0.05s -bash willy :0 Sat 2pm ? 0.00s ? willy pts/3 Sat 2pm 43:13 36.82s 36.82s BitchX willy ir willy pts/2 Sat 2pm 43:13 0.13s 0.06s /usr/bin/screen + echo + echo 'Adesso sto impostando due variabili.' Adesso sto impostando due variabili. + COLORE=nero + VALORE=9 + echo 'Questa una stringa: nero' Questa una stringa: nero + echo 'E questo un numero: 9' E questo un numero: 9 + echo + echo 'Ora ti restituisco l'\''invito.' Ora ti restituisco l'invito. + echo
,ra esiste un correttore HdebuggerI co* leto er -ash, dis onibile su 2ource.orge. 9ueste )unzioni er la correzione sono dis onibili nelle versioni i@ *oderne di -ash, a artire dalla 3.A.
3"
Potete attivare e disattivare la *odalit! di correzione quante volte volete con lo stesso scri t. 8a tabella successiva o))re una anora*ica di altre utili o zioni di -ash7 Tabella .#1: Panoramica delle opzioni ?ota1ione abbre iata ?ota1ione estesa set <) set <v set <A set <o noglob set <o verbose set <o Atrace %ffetto +isabilita la generazione del no*e dl )ile usando *etacaratteri HglobbingI. 2ta* a le linee in entrata alla shell co*e esse vengono lette. 2ta* a il traccia*ento dei co*andi loro esecuzione. ri*a della
8a lineetta viene utilizzata er attivare una o zione di shell e un i@ er disattivarla. Non )atevi con)ondere da ciEV Nell:ese* io sottostante di*ostria*o queste o zioni nella linea di co*ando7
willy:~/scripts> set -v willy:~/scripts> ls ls script-commentati.sh willy:~/scripts> set +v set +v willy:~/scripts> ls * script-commentati.sh willy:~/scripts> set -f willy:~/scripts> ls * ls: *: No such file or directory
script1.sh
script1.sh
3%
script1.sh
In alternativa, questi *odi ossono essere s eci)icati nello scri t stesso, aggiungendo le o zioni desiderate alla dichiarazione di shell nella ri*a linea. 8e o zioni ossono essere co*binate, co*e abitual*ente 3 il caso dei co*andi 5NIF7 =>;bin;bash -xv 5na volta che avete individuato la arte errata del vostro scri t, otete aggiungere le istruzioni echo ri*a di ogni co*ando di cui non vi )idate, in *odo che otrete vedere esatta*ente dove e erch le cose non )unzionano. Nello scri t d:ese* io scri t1<co**entato.sh, avrebbe otuto essere )atto co*e questo, su onendo ancora che l:elencazione degli utenti ci dia dei roble*i7
echo "messaggio della correzione: ora tentiamo di avviare il comando w"; w
In scri t i@ avanzati, echo uE essere inserita er *ostrare il contenuto di variabili in )asi diverse dello scri t, cosicch i di)etti ossono essere individuati7
echo "La variabile NOMEVAR ora impostata a $NOMEVAR."
2.#. 3o))ario
5no scri t di shell 3 una serie riutilizzabile di co*andi *essi in un )ile di testo eseguibile. 9ualsiasi editor di testo uE essere i* iegato er redigere degli scri t. 4li scri t iniziano con ,0 seguiti dal ercorso della shell che esegue i co*andi dello scri t. I co**enti vengono aggiunti ad uno scri t er vostro )uturo ro*e*oria ed anche er renderli co* rensibili ad altri utenti. 6: *eglio avere s iegazioni in eccesso iuttosto che insu))icienti. 8a ricerca di errori in uno scri t uE essere e))ettuata utilizzando le o zioni della shell. 8e o zioni della shell ossono venir usate er una caccia agli errori arziale o er analizzare l:intero scri t. Pure l:inseri*ento di co*andi echo in unti strategici 3 una co*une tecnica er eli*inare i roble*i.
2.$. ;sercizi
9uesto esercizio vi aiuter! a scrivere il vostro ri*o scri t. 1. 2crivete uno scri t utilizzando il vostro editor re)erito. 8o scri t dovrebbe *ostrare il ercorso alla vostra directorG ersonale ed il ti o di ter*inale che state usando. In aggiunta *ostra tutti i servizi attivati nel livello 3 del vostro siste*a Hsuggeri*ento7 usate HOME, TERM e ls /etc/rc3.d/S*I. Ca itolo 2. 2crivere e correggere gli scri t #(
2. 3. #. $.
1ggiungete co**enti al vostro scri t. 1ggiungete in)or*azioni er gli utenti del vostro scri t. Ca*biate i er*essi nel vostro scri t in *odo da oterlo eseguire. .ate girare lo scri t in *odalit! nor*ale ed in *odalit! di correzione. +ovrebbe )unzionare senza errori. &. Co**ettete errori nel vostro scri t7 osservate cosa succede se sbagliate a scrivere i co*andi, se di*enticate la ri*a linea o *ettete lD qualcosa di inco* rensibile, o se sbagliate a scrivere i no*i delle variabili di shell o li scrivete in caratteri *inuscoli do o che sono stati dichiarati in *aiuscolo. 0eri)icate cosa dicono i co**enti di correzione su ciE.
#1
#2
HOSTNAME=`/bin/hostname` HISTSIZE=1000 # Keyboard, bell, display style: the readline config file: if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then INPUTRC=/etc/inputrc fi PS1="\u@\h \W" export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC PS1 # Source initialization files for specific programs (ls, vim, less, ...) for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then . $i fi done # Settings for program initialization source /etc/java.conf export NPX_PLUGIN_PATH="$JRE_HOME/plugin/ns4plugin/:/usr/lib/netscape/plugins" PAGER="/usr/bin/less" unset i
9uesto )ile di con)igurazione de)inisce alcune ele*entari variabili dell:a*biente della shell cosD co*e anche alcune variabili richieste dagli utenti che )anno girare Yava e;o a licazioni Yava nei loro navigatori di rete. 4uardate la 2ezione 3.2. +ate uno sguardo al Ca itolo 7 er *aggiori in)or*azioni sul condizionale if utilizzato in questo )ile7 il Ca itolo % tratta dei cicli co*e il costrutto for. Il sorgente di -ash contiene dei )ile profile di ese* io er uso generale o individuale. 9uesti e quello nell:ese* io recedente necessitano di *odi)iche er )arli )unzionare nel vostro a*bienteV
3.1.1.2. ?etc?bashrc
Nei siste*i che o))rono *olte lici ti i di shell, sarebbe *eglio *ettere delle con)igurazioni s eci)iche er -ash in tale )ile, dal *o*ento che ;etc; ro)ile; viene letto anche da altre shell, co*e la shell -ourne. 6rrori generati da shell che non co* rendono la sintassi di -ash si revengono se arando i )ile di con)igurazione er i diversi ti i di shell. In questi casi ~/.bashrc dell:utente otrebbe untare a /etc/bashrc er includerlo nel rocesso di inizializzazione della shell al *o*ento dell:autenticazione. Potreste anche trovare che nel vostro siste*a /etc/profile contiene solo l:a*biente di shell e le i* ostazioni d:avvio, *entre /etc/bashrc contiene le de)inizioni co* lessive del siste*a er le )unzioni di shell e gli alias. Il )ile /etc/bashrc otrebbe essere richia*ato in /etc/profile o nei )ile di inizializzazione shell di un singolo utente. Il sorgente contiene dei )ile bashrc d:ese* io, o ure otreste trovarne una co ia in /usr/share/doc/bash-2.05b/startup-files. 9uesto 3 una orzione del bashrc allegato alla docu*entazione di -ash7 Ca itolo 3. 8:a*biente di -ash #3
6scludendo gli alias generali, contiene degli utili alias che )anno )unzionare i co*andi anche quando li scrivete in *odo errato. Nella 2ezione 3.$.2 trattere*o degli alias. 9uesto )ile contiene una )unzione, ps!ill7 le )unzioni saranno studiate in dettaglio nel Ca itolo 11.
3.1.2.1. ~/.bash_profile
9uesto 3 il )ile di con)igurazione re)erito er con)igurare i singoli a*bienti degli utenti. In questo )ile gli utenti ossono aggiungere delle con)igurazioni eAtra o ure ca*biare i valori rede)initi7
franky~> cat .bash_profile ################################################################# # # # .bash_profile file # # # # Executed from the bash shell when you log in. # # # ################################################################# source ~/.bashrc source ~/.bash_login case "$OS" in IRIX) stty sane dec stty erase ;; # SunOS) # stty erase # ;; *) stty sane
##
;; esac
9uesto utente con)igura il carattere bac?s ace er l:autenticazione in di))erenti siste*i o erativi. 1 arte ciE, vengono letti .bashrc e .bash_login dell:utente.
3.1.2.2. ~/.bash_login
9uesto )ile contiene delle s eci)iche i* ostazioni che nor*al*ente vengono eseguite solo al *o*ento in cui vi autenticate nel siste*a. Nell:ese* io, lo usia*o er con)igurare il valore di umas! e er *ostrare un elenco degli utenti connessi al *o*ento della autenticazione H loginI. /ale utente ottiene anche il calendario del *ese corrente7
####################################################################### # # # Bash_login file # # # # commands to perform from the bash shell at login time # # (sourced from .bash_profile) # # # ####################################################################### # file protection umask 002 # all to me, read to group and others # miscellaneous w cal `date +"%m"` `date +"%Y"`
3.1.2.3. ~/.profile
In assenza di ~/.bash_profile e di ~/.bash_login, viene letto ~/.profile. PuE tenere le stesse con)igurazioni, che oi sono accessibili anche dalle altre shell. 'icordatevi che altre shell otrebbero non co* rendere la sintassi di -ash.
3.1.2.#. Z;.bashrc
,ggi 3 i@ )requente utilizzare una shell senza autenticazione, er ese* io quando ci si 3 autenticati in a*biente gra)ico utilizzando le )inestre del ter*inale di F. 5na volta a erta una tale )inestra, l:utente non deve )ornire un no*e utente o una ass>ord7 non viene )atta nessuna autenticazione. 9uando ciE accade, -ash cerca ~/.bashrc a cui si )a ri)eri*ento nei )ile letti al *o*ento dell:autenticazione, il che signi)ica che non dovete inserire le stesse i* ostazioni in *olte lici )ile. In questo ~/.bashrc di utente una co ia di alias viene de)inita e vengono deter*inate delle variabili er s eci)ici rogra**i do o la lettura di /etc/bashrc dell:intero siste*a7
franky ~> cat .bashrc # /home/franky/.bashrc
#$
# Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # shell options set -o noclobber # my shell variables export PS1="\[\033[1;44m\]\u \w\[\033[0m\] " export PATH="$PATH:~/bin:~/scripts" # my aliases alias cdrecord='cdrecord -dev 0,0,0 -speed=8' alias ss='ssh octarine' alias ll='ls -la' # mozilla fix MOZILLA_FIVE_HOME=/usr/lib/mozilla LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins MOZ_DIST_BIN=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin export MOZILLA_FIVE_HOME LD_LIBRARY_PATH MOZ_DIST_BIN MOZ_PROGRAM # font fix alias xt='xterm -bg black -fg white &' # BitchX settings export IRCNAME="frnk" # THE END franky ~>
2i ossono trovare *olti ese* i nel acchetto -ash. 'icordate che i )ile ca* ione otrebbero necessitare di *odi)iche er )unzionare nel vostro siste*a. 4li alias sono trattati nella 2ezione 3.$.
3.1.2.$. Z;.bashMlogout
9uesto )ile contiene istruzioni s eci)iche er la rocedura di chiusura della sessione HlogoutI. Nell:ese* io la )inestra di ter*inale viene cancellata al *o*ento della chiusura della sessione. CiE 3 utile er connessioni re*ote che lasceranno una )inestra ulita do o la loro chiusura.
franky ~> cat .bash_logout ####################################################################### # # # Bash_logout file # # # # commands to perform from the bash shell at logout time # # # #######################################################################
#&
)llu trazione 1/1#1/ )nviti differenti per utenti differenti 8a *aggioranza degli scri t vengono eseguiti in un a*biente rivato7 le variabili non vengono ereditate dai rocessi )igli a *eno che esse non siano es ortate dalla shell genitrice. 5sare source con un )ile contenente co*andi di shell 3 una *aniera er a licare le *odi)iche al vostro a*biente ersonale e er i* ostare le variabili nella shell corrente. 9uesto ese* io di*ostra anche l:utilizzo di inviti di))erenti da arte di utenti di))erenti. In tal caso rosso signi)ica ericolo. 9uando avete un invito verde, non reoccu atevi eccessiva*ente. Notate che source resourcefile 3 lo stesso di . resourcefile. 2e doveste erdervi tra tutti questi )ile di con)igurazione e ritrovarvi a con)ronto con i* ostazioni la cui origine non 3 chiara, utilizzate le istruzioni echo ro rio co*e er gli scri t di ricerca degli errori Hv. 2ezione 2.3.2I. Potreste aggiungere delle linee co*e questa7
echo "Ora in esecuzione .bash_profile.."
echo "Ora si impsta PS1 in .bashrc:" export PS1="[valore qualsiasi]" echo "PS1 adesso impostato a $PS1"
3.2. 1ariabili
3.2.1. 0ipi di variabili
Co*e visto negli ese* i recedenti, le variabili di shell sono in caratteri *aiuscoli convenzione. -ash tiene un elenco di due ti i di variabili7 er
#"
LOGNAME=franky LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01 :or=01;05;37;41:MACHINES=octarine MAILCHECK=60 MAIL=/var/mail/franky MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man MEAN_MACHINES=octarine MOZ_DIST_BIN=/usr/lib/mozilla MOZILLA_FIVE_HOME=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin MTOOLS_FAT_COMPATIBILITY=1 MYMALLOC=0 NNTPPORT=119 NNTPSERVER=news NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins OLDPWD=/nethome/franky OS=Linux PAGER=less PATH=/nethome/franky/bin.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/sbi n:/usr/X11R6/bin:/PS1=\[\033[1;44m\]franky is in \w\[\033[0m\] PS2=More input> PWD=/nethome/franky SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106 SHELL=/bin/bash SHELL_LOGIN=--login SHLVL=2 SSH_AGENT_PID=22161
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106 START_WM=twm TERM=xterm TYPE=type USERNAME=franky USER=franky _=/usr/bin/printenv VISUAL=vi WINDOWID=20971661 XAPPLRESDIR=/nethome/franky/app-defaults XAUTHORITY=/nethome/franky/.Xauthority XENVIRONMENT=/nethome/franky/.Xdefaults XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C %S:/usr/X11R6/lib/X11/%XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB XMODIFIERS=@im=none XTERMID= XWINHOME=/usr/X11R6 X=X11R6 YACC=bison -y
#%
BASH_VERSINFO=([0]="2" BASH_VERSION='2.05b.0(1)-release' COLUMNS=80 DIRSTACK=() DO_FORTUNE= EUID=504 GROUPS=() HERE=/home/franky HISTFILE=/nethome/franky/.bash_history HOSTTYPE=i686 IFS=$' LINES=24 MACHTYPE=i686-pc-linux-gnu OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PIPESTATUS=([0]="0") PPID=10099 PS4='+ PWD_REAL='pwd SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor THERE=/home/franky UID=504
Per i* ostare una variabile nella shell usate7 Ca itolo 3. 8:a*biente di -ash $(
VARNAME=" alore" 8:inseri*ento di s azi attorno al segno uguale causer! degli errori. 6: una buona usanza virgolettare le stringhe quando si assegnano dei valori alle variabili7 ciE ridurr! le ossibilit! di sbagliare. 1lcuni ese* i utilizzando *aiuscole e *inuscole, nu*eri e s azi7
franky ~> MYVAR1="2" franky ~> echo $MYVAR1 2 franky ~> first_name="Franky" franky ~> echo $first_name Franky franky ~> full_name="Franky M. Singh" franky ~> echo $full_name Franky M. Singh franky ~> MYVAR-2="2" bash: MYVAR-2=2: command not found franky ~> MYVAR1 ="2" bash: MYVAR1: command not found franky ~> MYVAR1= "2" bash: 2: command not found franky ~> unset MYVAR1 first_name full_name franky ~> echo $MYVAR1 $first_name $full_name <--no output--> franky ~>
$1
franky ~> export full_name franky ~> bash franky ~> echo $full_name Franky M. Singh franky ~> export full_name="Charles the Great" franky ~> echo $full_name Charles the Great franky ~> exit franky ~> echo $full_name Franky M. Singh franky ~>
9uando all:inizio si rova a leggere il valore di full_name in una sottoshell, esso non 3 l! H echo *ostra una stringa vuotaI. 8a sottoshell si chiude e full_name viene es ortato in quella genitrice O una variabile uE essere es ortata do o che le 3 stato assegnato un valore. Poi viene avviata una nuova sottoshell in cui 3 visibile la variabile es ortata dalla genitrice. 8a variabile viene *odi)icata er contenere un altro no*e, *a nella genitrice il valore di questa variabile resta lo stesso.
HOME
IFS
MAILPATH
$2
Il valore dell:ulti*o argo*ento di o zioni elaborato dall:integrato getopts. 8:indice dell:ulti*o argo*ento di o zioni elaborato dall:integrato getopts. 5n elenco di directorG se arato dai due unti J7K in cui la shell cerca dei co*andi. 8a stringa ri*aria dell:invito HpromptI. Il valore rede)inito 3 [:Us<UvU\ :[. 8a stringa secondaria dell:invito HpromptI. Il valore rede)inito 3 [:T :[.
COLUMS
COMPREPLY
$3
DIRSTACK EUID FCEDIT FIGNORE FUNCNAME GLOBIGNORE GROUPS histchars HISTCMD HISTCONTROL HISTFILE HISTFILESIZE
5na variabile *atriciale con gli attuali contenuti della catasta H tackI delle directorG. Il reale I+ nu*erico dell:utente corrente. 8:editor utilizzato co*e integrato fc. rede)inito dall:o zione -e nel co*ando
5n elenco dei su))issi da ignorare se arato dai due unti J7K quando si esegue il co* leta*ento dei )ile. Il no*e di qualsiasi )unzione di shell attual*ente in esecuzione. 5n elenco, se arato dai due unti J7K, degli sche*i che de)iniscono l:insie*e dei no*i dei )ile da ignorare durante l:es ansione dei no*i. 5na variabile *atriciale che contiene l:elenco dei gru a artiene l:attuale utente. i a cui
.ino a tre carattere che controllano l:es ansione della cronologia, la sostituzione ra ida e la tokenizzazione. Il nu*ero cronologico, o l:indice nell:elenco della cronologia, del co*ando corrente. +eter*ina se un co*ando viene aggiunto al )ile della cronologia. Il no*e del )ile in cui viene salvata la cronologia dei co*andi. Il valore rede)inito 3 ~/.bash_history. Il nu*ero *assi*o di linee contenute nel )ile di cronologia, di solito $((. 5n elenco, suddiviso dai due unti J7K, degli sche*i utilizzati er decidere quali linee di co*ando debbano essere salvate nella lista della cronologia. Il nu*ero *assi*o di co*andi da ricordare nella lista della cronologia Hil valore rede)inito 3 $((I. Contiene il no*e di un )ile nello stesso )or*ato di /etc/hosts che dovrebbe essere letto quando la shell ha bisogno di co* letare un no*e di host. Il no*e del corrente host. 5na stringa che descrive la *acchina in cui sta girando -ash. Controlla il co* orta*ento della shell quando riceve un carattere %&co*e unico ingresso. Il no*e del )ile di inizializzazione 'eadline, che revale sul rede)inito /etc/inputrc. 5tilizzato er stabilire la categoria delle localizzazioni er tutte quelle categorie non selezionate s eci)icata*ente con una variabile che inizia con LC_. 9uesta variabile scavalca il valore di LANG e di ogni altra variabile LC_ che s eci)ica una categoria di localizzazione. 9uesta variabile deter*ina l:ordine di collazione utilizzato quando si $#
HISTIGNORE
HISTSIZE
LANG
LC_ALL LC_COLLATE
riordinano i risultati delle es ansioni dei no*i dei )ile, stabilisce il co* orta*ento di es ressioni di intervalli Hrange expre ion I, classi di equivalenze, e sequenze di racccolta Hcollating e8uence I con es ansione dei no*i di )ile e corris ondenza di sche*i Hpattern matchingI. LC_CTYPE 9uesta variabile deter*ina l:inter retazione dei caratteri e il co* orta*ento delle classi di caratteri con l:es ansione dei no*i dei )ile e la corris ondenza di sche*i Hpattern matchingI. 9uesta variabile deter*ina la localizzazione utilizzata stringhe tra do ie virgolette recedute da un segno Q\R. er tradurre
9uesta variabile deter*ina la categoria della localizzazione utilizzata er il )or*ato dei nu*eri. Il nu*ero di linea nello scri t o nella )unzione di shell attual*ente in esecuzione. 5tilizzato dall:integrato select er stabilire la lunghezza della colonna er gli elenchi di selezione di sta* a. 5na stringa che descrive nella sua interezza il ti o di siste*a in cui viene eseguito -ash, nel )or*ato standard 4N5 CP5<C,=P1NL< 2L2/6=. 9uanto s esso Hin secondiI la shell dovrebbe controllare la osta nei )ile s eci)icati nelle variabili MAILPATH o MAIL. 8a recedente directorG di lavoro i* ostata dall:integrato cd. 2e i* ostata con il valore 1, -ash *ostra i *essaggi di errore generati dall:integrato getopts. 5na stringa che descrive il siste*a o erativo in cui sta girando -ash. 5na variabile *atriciale contenente un elenco dei valori degli stati di uscita dai rocessi negli accoda*enti Hpipeline I in ri*o iano eseguiti i@ recente*ente Hche otrebbero contenere solo un singolo co*andoI. 2e questa variabile si trova nell:a*biente quando si avvia bash, la shell entra in *odalit! P,2IF. 8:I+ di rocesso del rocesso genitore della shell. 2e i* ostata, il valore viene inter retato co*e un co*ando da eseguire ri*a della sta* a di qualsiasi invito ri*ario Hprimar! prompt o PS1I. Il valore di questa variabile 3 utilizzato co*e invito del co*ando select. Il rede)inito 3 QP?R Il valore 3 l:invito sta* ato ri*a che la linea di co*ando venga resentata con echo quando 3 i* ostata l:o zione -x. Prei* ostato a Q]R. 8a directorG corrente di lavoro co*e de)inita dal co*ando integrato cd. ,gni volta che si )a ri)eri*ento a questo ara*etro, viene generato un nu*ero casuale co* reso tra ( e 327&7. 1ssegnare un valore a questa variabile seleziona il generatore di nu*eri casuali.
MACHTYPE
$$
8a variabile rede)inita er l:integrato read. 9uesta variabile au*enta con il nu*ero dei secondi da quando 3 stata avviata la shell. 5n elenco, se arato dai due unti J7K, delle o zioni di shell abilitate. Incre*entata di uno ogni volta che viene avviata una nuova istanza di -ash. Il valore di questo ara*etro viene i* iegato co*e stringa di )or*ato s eci)icante co*e le in)or*azioni di te* orizzazione degli accoda*enti H re)issate con la arola riservata timeI dovrebbero essere *ostrate. 2e in ostata con un valore *aggiore di zero, TMOUT viene trattata co*e il timeout rede)inito er la )unzione read. 8:attuale I+ utente nu*erico dell:utente corrente.
TIMEFORMAT
TMOUT UID
Controllate le agine *an, in)o o doc di -ash er in)or*azioni estese. 1lcune variabili sono di sola lettura, altre vengono i* ostate auto*atica*ente ed alcune erdono il loro signi)icato quando i* ostate con un valore diverso da quello rede)inito.
3.2.$.
Para)etri speciali
8a shell tratta in *odo s eciale diversi ara*etri. 9uesti ara*etri ossono essere solo re)erenziati7 un assegna*ento a loro non 3 consentito. Tabella 1#1: 2ariabili peciali di ba h )arattere $* @efini1ione 6s ansione ai ara*etri osizionali, iniziando da uno. 9uando avviene l:es ansione con gli a ici do i, essa si es ande ad una singola arola con il valore di ciascun ara*etro se arato dal ri*o carattere della variabile s eciale IFS. 6s ansione ai ara*etri osizionali, iniziando da uno. 9uando avviene l:es ansione con gli a ici do i, ciascun ara*etro si es ande in una arola se arata. 6s ansione al nu*ero di ara*etri osizionali in deci*ale. 6s ansione allo stato di uscita dell:accoda*ento in recente*ente ri*o iano eseguito i@
$@ $# $?
$$$ $!
5n trattino Hh!phenI si es ande alle correnti )lag delle o zioni co*e s eci)icato dall:invocazione, attraverso il co*ando integrato set, o quelle i* ostate dalla shell stessa Hco*e ad ese* io -iI. 2i es ande all:I+ di rocesso della shell. 2i es ande all:I+ di rocesso del co*ando in sotto)ondo HasincronoI eseguito i@
$&
di recente. $0 2i es ande al no*e della shell o dello scri t di shell. 8a variabile con la sottolinea Hunder coreI viene i* ostata all:avvio della shell e contiene il no*e di )ile assoluto della shell o dello scri t che viene eseguito cosD co*e assato nella lista degli argo*enti. 0iene anche i* ostata con l:intero ercorso dei no*i di ciascun co*ando eseguito e iazzato nell:a*biente es ortato con quel co*ando. 9uando si controlla la osta, questo ara*etro contiene il no*e del )ile di osta. AB s. AC 8:i* le*entazione di Q\^R 3 stata se* re un roble*a e realistica*ente dovrebbe essere ri* iazzata con il co* orta*ento di Q\_R. In quasi tutti i casi in cui i rogra**atori usano Q\^R, quest:ulti*i intendono Q\_R. Q\^R uE causare errori ed anche )alle nella sicurezza del vostro so)t>are. I ara*etri osizionali sono le arole che seguono il no*e di uno scri t di shell. 6ssi sono collocati nelle variabili $1, $2, $3 e cosD via. 8unghe secondo necessit!, le variabili vengono aggiunte ad una *atrice interna. $# contiene il nu*ero totale dei ara*etri, co*e viene di*ostrato con questo se* lice scri t7
#!/bin/bash # positional.sh # Questo script legge 3 parametri posizionali e li stampa. POSPAR1="$1" POSPAR2="$2" POSPAR3="$3" echo echo echo echo echo "$1 il primo parametro posizionale, \$1." "$2 il secondo parametro posizionale, \$2." "$3 il terzo parametro posizionale, \$3." "Il numero totale di parametri posizionali $#."
$_
+i i@ sulla valutazione di questi ara*etri nel Ca itolo 7 e nella 2ezione %.7. 1lcuni ese* i sugli altri ara*etri s eciali7
franky ~> grep dictionary /usr/share/dict/words dictionary
$7
franky ~> echo $_ /usr/share/dict/words franky ~> echo $$ 10662 franky ~> mozilla & [1] 11064 franky ~> echo $! 11064 franky ~> echo $0 bash franky ~> echo $? 0 franky ~> ls nonesiste ls: nonesiste: No such file or directory franky ~> echo $? 1 franky ~>
8:utente frank! co*incia con l:inseri*ento del co*ando grep, che deter*ina l:assegna*ento della variabile _. 8:I+ del rocesso della sua shell 3 1(&&2. +o o aver *esso un lavoro H jobI in sotto)ondo, ! contiene l:I+ del rocesso del lavoro in sotto)ondo. 8a shell in )unzione 3 bash. 9uando si co**ette un errore, ? contiene un codice d:uscita diverso da ( HzeroI.
Pri*a di tutto 3 i@ )acile che co**ettiate errori se indicate i no*i dei )ile e delle directorG *anual*ente ogni volta che vi servono. In secondo luogo su onete che frank! voglia dare il suo scri t a carol, oi carol dovr! e))ettuare abbastanza nu*erose *odi)iche ri*a di oter usare lo Ca itolo 3. 8:a*biente di -ash $"
scri t er salvare altre directorG. Per un )acile riciclaggio, rendete variabili tutti i )ile, directorG, no*i utente, no*i server, ecc. CosD, avrete bisogno di *odi)icare un valore er una volta, senza dover scorrere l:intero scri t er controllare dove 3 resente un ara*etro. 9uesto 3 un ese* io7
#!/bin/bash # Questo script fa una copia di salvataggio della mia directory personale. # Cambiate i valori delle variabili per far funzionare lo script per voi: BACKUPDIR=/home BACKUPFILES=franky TARFILE=/var/tmp/home_franky.tar BZIPFILE=/var/tmp/home_franky.tar.bz2 SERVER=bordeaux REMOTEDIR=/opt/backup/franky LOGFILE=/home/franky/log/home_backup.log cd $BACKUPDIR # Questo crea l'archivio tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1 # Per prima cosa rimuove il vecchio file bzip2. Ridirige gli errori dal momento che # ne produce alcuni se l'archivio non esiste. Poi crea un nuovo file compresso. rm $BZIPFILE 2> /dev/null bzip2 $TARFILE # Copia il file in un altro host abbiamo le chiavi ssh per fare questo lavoro senza # bisogno di interventi. scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1 # Crea una marca temporale in un file di registro. date >> $LOGFILE echo salvataggio riuscito >> $LOGFILE
@irector. oluminose e banda passante limitata 9uello so ra 3 solo un ese* io che ognuno uE co* rendere, usando una iccola directorG e un host sulla stessa sottorete. In base alla vostra larghezza di banda, la di*ensione della directorG e della osizione del server re*oto, esso uE richiedere una inso ortabile quantit! di te* o er eseguire le co ie di salvataggio con questo *eccanis*o. Per directorG i@ volu*inose e una larghezza di banda in)eriore, usate rs.nc er *antenere le directorG allineate ad entra*bi i ca i.
$%
I caratteri di esca e si usano er ri*uovere il signi)icato s eciale di un singolo carattere. 5na barra inversa Hback la hI senza a ici, U, viene i* iegata in -ash co*e carattere di esca e. 6ssa i* edisce il valore letterale del carattere i**ediata*ente successivo, ad eccezione della nuovalinea Hne$lineI. 2e un carattere di nuova linea a are subito do o la barra inversa, ciE segna la continuazione della linea quando 3 i@ lunga della larghezza del ter*inale7 la barra inversa viene ri*ossa dal )lusso in ingresso ed ignorata a tutti gli e))etti.
franky ~> data=20021226 franky ~> echo $data 20021226 franky ~> echo \$data $data
Nell:ese* io viene creata la variabile data ed i* ostata er contenere un valore. Il ri*o echo *ostra il valore della variabile, *a con il secondo il segno del dollaro viene reso con esca e.
franky ~> echo $data 2((2122& franky ~> echo "`data`" Sun Apr 20 11:22:06 CEST 2003
&(
franky ~> echo "I'd say: \"Go for it!\"" I'd say: "Go for it!" franky ~> echo "\" More input>" franky ~> echo "\\" \
3.3.%. Locali
5na stringa tra virgolette do ie receduta da un segno di dollaro )ar! si che la stringa venga tradotta secondo la localizzazione HlocaleI corrente. 2e la localizzazione corrente 3 QCR o QP,2IFR, il segno dollaro viene ignorato. 2e la stringa viene tradotta e ri* iazzata, la sostituzione 3 tra a ici do i.
D.2. %spansione della shell D.2.1. In generale +o o che il co*ando 3 stato suddiviso in )ra**enti H tokenI Hv. 2ezione 1.#.1.1I, tali )ra**enti o arole vengono es ansi o risolti. Ci sono otto ti i di es ansione eseguita, che trattere*o nelle rossi*e sezioni, nell:ordine in cui vengono es ansi. +o o tutte le es ansioni, viene eseguita la ri*ozione degli a ici.
3.#.2. ;spansione delle parentesi gra((e 8:es ansione delle gra))e Hbrace expan ionI 3 un *eccanis*o con cui ossono essere generate delle stringhe arbitrarie. 4li sche*i HpatternI da sotto orre all:es ansione delle gra))e rendono la )or*a di un P9%:;3&L& o zionale, seguito da una serie di stringhe se arate da virgole tra una co ia di gra))e, seguita da un P&4T4C9)PT o zionale. Il rea*bolo 3 re)issato in base a ciascuna stringa contenuta tra le gra))e e il ostscri t viene agganciato a d ogni stringa risultante, con es ansione da sinistra a destra.
&1
8e es ansioni delle gra))e ossono essere annidate. I risultati di ogni stringa es ansa non vengono riordinati, conservando l:ordine da sinistra a destra7
franky ~> echo p{a,e,i,o,u}zza pazza pezza pizza pozza puzza
8:es ansione delle gra))e viene eseguita ri*a di ogni altra es ansione e viene *antenuto qualsiasi carattere s eciale er le ulteriori es ansioni. -ash non a lica alcuna inter retazione sintattica al contesto dell:es ansione o del testo tra gra))e. Per evitare con)litti con l:es ansione dei ara*etri, la stringa Q\aQ non viene considerata co*e soggetta ad es ansione delle gra))e. 5na es ansione delle gra))e i* ostata corretta*ente deve contenere delle gra))e a erte e chiuse senza virgolette ed al*eno una virgola senza a ici. 9ualsiasi es ansione delle gra))e )or*ata in *odo errato viene lasciata senza *odi)iche.
3.#.3.
2e una arola inizia con un carattere tilde non virgolettato HQZRI, tutti i caratteri )ino alla ri*a barra senza a ici Ho tutti i caratteri, se non c:3 una barra senza a iciI vengono considerati un prefi o della tilde Htilde#prefixI. 2e nessuno dei caratteri nel re)isso della tilde sta tra degli a ici, i caratteri nel re)isso della tilde successivi alla tilde stessa vengono trattati co*e un ossibile no*e er l:autenticazione HloginI. 2e il no*e di autenticazione 3 una stringa vuota H null tringI, la tilde viene sostituita dal valore della variabile di shell HOME. 2e HOME non 3 i* ostata, essa 3 sostituita con la directorG ersonale dell:utente che sta utilizzando la shell. 1ltri*enti il re)isso tilde viene ri* iazzato dalla directorG ersonale associata al no*e di autenticazione s eci)icato. 2e il re)isso tilde 3 QZ]R, il valore della variabile di shell PWD sostituisce il re)isso tilde. 2e quest:ulti*o 3RZ<R, il valore della variabile di shell OLDPWD, se i* ostato, viene sostituito. 2e i caratteri che seguono la tilde nel re)isso tilde consistono in un nu*ero N, eventual*ente re)issato da un Q]R o un Q<R, il re)isso della tilde viene sostituito dall:ele*ento corris ondente reso dalla catasta H tackI delle directorG, co*e otrebbe essere *ostrato tra*ite l:invocazione dell:integrato dirs con i caratteri che seguono la tilde nel re)isso tilde co*e argo*ento. 2e il re)isso tilde, senza la tilde, consiste in un nu*ero non receduto da Q]R oR<R, si intende Q]R. 2e il no*e di autenticazione non 3 valido o l:es ansione della tilde )allisce, la arola viene lasciata i**utata. ,gni assegnazione di variabile 3 veri)icata er re)issi tilde senza a ici che seguono i**ediata*ente un [7[ o [b[. In questo caso viene eseguita anche l:es ansione della tilde. +i conseguenza, uno uE usare no*i di )ile con la tilde nelle assegnazioni a PATH, MAILPATH e CDPATH, e la shell attribuir! il valore es anso. 6se* io7
franky ~> export PATH="$PATH:~/testdir"
~/testdir sar! es ansa a $HOME/testdir, cosicch se $HOME 3 /var/home/franky, la Ca itolo 3. 8:a*biente di -ash &2
Notate che questa non 3 la stessa cosa di echo $N*. Il costrutto che segue consente la creazione della no*inata variabile se essa non esiste ancora7 ${VAR:=valore} 6se* io7
franky ~> echo $FRANKY franky ~> echo ${FRANKY:=Franky} Franky
Co*unque, i ara*etri s eciali, tra gli altri i ara*etri osizionali, ossono non essere assegnati in questo *odo.
&3
Pi@ avanti discutere*o dell:uso delle arentesi tonde Hcurl! brace I er il tratta*ento delle variabili nel Ca itolo 1(. =aggiori in)or*azioni si ossono trovare nelle agine in)o di -ash.
EcomandoE -ash e))ettua l:es ansione eseguendo C,=1N+, e ri* iazzando la sostituzione dei co*andi con lo standard out ut del co*ando, con cancellazione di qualsiasi nuovalinea H ne$lineI resente. 8e nuovalinea incor orate non vengono cancellate, *a otrebbero essere ri*osse durante la sco* osizione delle arole H$ord plittingI.
franky ~> echo `date` gio feb 6 10:06:20 CET 2003
9uando si utilizza la )or*a di sostituzione ad a ici inversi vecchio stile, la barra inversa *antiene il suo signi)icato letterale, eccetto quando 3 seguita da [\[, [`[ o [U[. I ri*i a ici inversi non receduti da una barra inversa ter*inano la sostituzione dei co*andi.. 9uando si usa la )or*a [\ HC,=1N+,I[, tutti i caratteri )ra arentesi )or*ano il co*ando7 nessuno 3 trattato in *odo s eciale. 8a sostituzione dei co*andi uE essere annidata. Per annidare quando si utilizza la )or*a ad a ici inversi, create un esca e degli a ici inversi con le barre inverse. 2e la sostituzione a are tra a ici do vengono attuate sui risultati. i, la sco* osizione delle arole e l:es ansione dei no*i non
arit*etiche ossono essere annidate. 8a valutazione delle es ressioni arit*etiche 3 eseguita in interi di lunghezza )issa senza controllo di strari a*ento O sebbene la divisione er zero venga intercettata e riconosciuta co*e errore. 4li o eratori sono se* lice*ente gli stessi del linguaggio di rogra**azione C. In ordine decrescente di recedenza, la lista si resenta co*e questa7 Tabella 1#<: &peratori aritmetici Gperatore 01']] e 01'<< ]]01' e <<01' <e] VeZ ^^ ^,; e d ]e< ee e TT eb, Tb, e e T bb e Vb f g X ff XX eA r ? eA r 7 eA r , Significato Post<incre*ento e ost<decre*ento della variabile Pre<incre*ento e re<decre*ento della variabile *eno e i@ unario negazione logica e a livello bit Hbit>iseI es onenziazione *olti licazione, divisione, resto addizione e sottrazione s osta*ento a livello bit Hbit>iseI a sinistra e a destra o eratori di con)ronto uguaglianza e disuguaglianza 1N+ a livello bit Hbit>iseI ,' esclusivo a livello bit Hbit>iseI ,' a livello bit Hbit>iseI 1N+ logico ,' logico valutazione condizionale se aratore tra es ressioni
8e variabili di shell sono er*esse co*e o erandi7 l:es ansione dei ara*etri viene eseguita ri*a che sia valutata l:es ressione. 1ll:interno di un:es ressione le variabili di shell ossono essere re)erenziate er no*e senza usare la sintassi dell:es ansione dei ara*etri. Il valore di una variabile 3 valutato co*e es ressione arit*etica quando 3 re)erenziato. 5na variabile di shell non deve avere attivato il suo attributo intero er essere utilizzata in un:es ressione. 8e costanti che iniziano er ( HzeroI vengono inter retate co*e nu*eri ottali. 5no [(A[ o [(F[ denota un esadeci*ale. 1ltri*enti, i nu*eri assu*ono la )or*a [J-126:P:KN[, dove [-126[ 3 un nu*ero deci*ale tra 2 e &#, che ra resenta la base arit*etica, e N 3 un nu*ero in quella base. 2e viene o*esso [-126P[, allora viene usata una base 1(. 8e ci)re *aggiori di % vengono ra resentate con lettere *inuscole, lettere *aiuscole, [_[ e [M[, in quest:ordine. se [-126[ 3 *inore o uguale a 3&, le lettere *inuscole e *aiuscole ossono essere utilizzate indi))erente*ente er ra resentare i nu*eri tra 1( e 3$.
&$
4li o eratori vengono valutati er ordine di recedenza. 8e sottoes ressioni tra arentesi sono valutate er ri*e e ossono scavalcare le so rastanti regole di recedenza. +ove ossibile, gli utenti di -ash dovrebbero rovare ad usare la sintassi con le arentesi quadre7 A" %S6F%SSIG?% # /uttavia, ciE calcoler! solo il risultato di %4P9%44)&6%, e non eseguir! controlli7
franky ~> echo $[365*24] 8760
es ansioni in arole su questi caratteri. 2e I.2 non 3 de)inito o il suo valore 3 esatta*ente [es azioTetabTenuovalineaT[ Hquello rede)initoI, allora qualsiasi sequenza di caratteri IFS serve er deli*itare le arole. 2e IFS ha un valore diverso da quello base, allora le sequenze dei caratteri degli s azi bianchi [s azio[ e [/ab[ vengono ignorate all:inizio e alla )ine della arola er tutto il carattere di s azio bianco resente nel valore di IFS Hun carattere di s azio bianco IFSI. 9ualsiasi carattere nell:IFS che non sia uno s azio bianco di IFS, insie*e ad ogni adiacente carattere di s azio bianco di IFS, deli*ita un ca* o. 5na sequenza di caratteri di s azio bianco IFS viene considerata anche co*e un deli*itatore. 2e il valore di IFS 3 nullo, non avviene alcuna sco* osizione delle arole. 4li argo*enti nulli es liciti H[[[[ o [::[I vengono *antenuti. 4li argo*enti nulli i* liciti non tra a ici vengono ri*ossi oich rovengono dall:es ansione di ara*etri che non hanno valori. 2e un ara*etro senza valore viene es anso all:interno di a ici do i, ne deriva un argo*ento nullo e viene *antenuto. %spansione e scomposi1ione delle parole 2e l:es ansione non avviene, non si esegue la sco* osizione.
&7
3.$. 2lias
3.$.1. Cosa sono gli alias?
5n alias consente ad una stringa di essere la sostituta di una arola quando essa 3 utilizzata co*e la ri*a arola di un se* lice co*ando. 8a shell conserva un elenco degli alias che ossono essere de)initi ed eli*inati con i co*andi integrati alias e unalias. .ornite alias senza o zioni er *ostrare un elenco di alias noto alla shell corrente.
franky: ~> alias alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias PAGER='less -r' alias Txterm='export TERM=xterm' alias XARGS='xargs -r' alias cdrecord='cdrecord -dev 0,0,0 -speed=8' alias e='vi' alias egrep='grep -E' alias ewformat='fdformat -n /dev/fd0u1743; ewfsck' alias fgrep='grep -F' alias ftp='ncftp -d15' alias h='history 10' alias fformat='fdformat /dev/fd0H1440' alias j='jobs -l' alias ksane='setterm -reset' alias ls='ls -F --color=auto' alias m='less' alias md='mkdir' alias od='od -Ax -ta -txC' alias p='pstree -p' alias ping='ping -vc1' alias sb='ssh blubber' alias sl='ls' alias ss='ssh octarine' alias tar='gtar' alias tmp='cd /tmp' alias unaliasall='unalias -a' alias vi='eval `resize`;vi' alias vt100='export TERM=vt100' alias which='type' alias xt='xterm -bg black -fg white &' franky ~>
4li alias sono utili er s eci)icare la versione rede)inita di un co*ando che esiste in diverse versioni nel vostro siste*a o ure er indicare le o zioni rede)inite di un co*ando. 5n altro uso degli alias 3 er correggere degli errori di scrittura. 8a ri*a arola di ogni se* lice co*ando, se riva di a ici, viene controllata er vedere se ha un alias. 2e cosD 3, quella arola viene sostituita dal testo dell:alias. Il no*e degli alias e il testo di ri* iazzo uE contenere qualsiasi valido dato in ingresso di shell, co* resi i *etacaratteri della shell, eccetto che il no*e dell:alias non uE contenere [b[. 8a ri*a arola di un testo di ri* iazzo viene controllata er la resenza di alias, *a una arola che 3 identica ad un alias da es andere non viene es ansa una seconda volta. CiE signi)ica che uno uE creare un alias ls di ls -F, er ese* io, e -ash non cercher! di es andere ricorsiva*ente il testo di ri* iazzo. 2e l:ulti*o carattere di un valore di alias 3 uno s azio o un carattere tab, allora la successiva arola del co*ando che segue l:alias verr! anche controllata er l:es ansione degli alias.
&"
4li alias non vengono es ansi quando la shell non 3 interattiva, a *eno che non venga i* ostata l:o zione expand_aliases *ediante l:integrato di shell shopt.
franky ~> unalias dh franky ~> dh bash: dh: command not found franky ~>
-ash legge se* re al*eno una linea co* leta di dati in ingresso ri*a di eseguire uno qualsiasi dei co*andi di quella linea. 4li alias vengono es ansi quando viene letto un co*ando, non quando esso viene eseguito. +unque, una de)inizione di alias che co* are nella stessa linea co*e altro co*ando non ha e))etto )ino a che non viene letta la successiva linea in ingresso. I co*andi che seguono la de)inizione di alias in quella linea non sono in)luenzati dal nuovo alias. /ale co* orta*ento 3 anche un roble*a quando vengono eseguite delle )unzioni. 4li alias vengono es ansi quando viene letta la de)inizione di una )unzione, non quando la )unzione viene eseguita, erch la de)inizione di una )unzione 3 essa stessa un co*ando co* osto. +i conseguenza, gli alias de)initi in una )unzione non sono dis onibili se non do o l:esecuzione di quella )unzione. Per essere sicuri, *ettete se* re le de)inizioni degli alias in una riga se arata, e non utilizzate alias in co*andi co* osti. I rocessi )igli non ereditano gli alias. 8a shell -ourne HshI non riconosce gli alias. +i i@ sulle )unzioni nel Ca itolo 11.
Le fun1ioni sono piJ eloci 4li alias vengono resi in considerazione do o le )unzioni e cosD la risoluzione 3 i@ lenta. =entre gli alias sono i@ se* lici da co* rendere, le )unzioni di shell sono re)erite in luogo degli alias er quasi ogni sco o.
&%
+ate un:occhiata alle agine In)o di -ash, sezione 2hell -uilt<in Co**ands<T/he 2et -uilt<in er una descrizione di ogni o zione. 5na quantit! di o zioni ha una scorciatoia da un carattere7 er ese* io, l:o zione xtrace corris onde a set -x.
Per *odi)icare te* oranea*ente il corrente a*biente, o er l:utilizzo in uno scri t, otre**o usare set. 5sate il trattino O Hda hI. er abilitare un:o zione, ] er disabilitarla7
willy:~/test> set -o noclobber willy:~/test> touch test willy:~/test> date > test
iuttosto
7(
bash: test: cannot overwrite existing file willy:~/test> set +o noclobber willy:~/test> date > test
8:ese* io so rastante *ostra l:o zione noclobber, che reviene la sovrascrittura dei )ile esistenti da arte di o erazioni di ridirezione. 8o stesso vale er le o zioni a singolo carattere, er ese* io -u, che tratteranno le variabili non de)inite co*e errore quando de)inite, con uscita di una shell non interattiva quando si incontrano tali errori.
willy:~> echo $VAR
9uesta o zione 3 utile anche er sco rire assegna*enti scorretti alle variabili7 lo stesso errore, er ese* io, ca iter! ure quando si assegna una stringa di caratteri ad una variabile che era stata dichiarata es licita*ente co*e una contenente solo valori nu*erici interi. +i seguito un ulti*o ese* io che *ostra l:o zione noglob, che reviene l:es ansione di caratteri s eciali7
willy:~/testdir> set -o noglob willy:~/testdir> touch * willy:~/testdir> ls -l * -rw-rw-r-- 1 willy willy 0 Feb 27 13:37 *
3.'. 3o))ario
8:a*biente -ash uE essere con)igurato global*ente ed in base al singolo utente. 2i usano vari )ile di con)igurazione er de)inire in *odo articolareggiato il co* orta*ento della shell. 9uesti )ile contengono o zioni di shell, i* ostazioni er variabili, de)inizioni di )unzioni e diversi altri blocchi di costruzione er crearci un a*biente con)ortevole. 1d eccezione dei ara*etri riservati della shell -ourne, di -ash e quelli s eciali, i no*i delle variabili ossono essere scelti i@ o *eno libera*ente. 2icco*e arecchi caratteri hanno do i o tri li signi)icati in base all:a*biente, -ash utilizza un siste*a di virgolettature er eli*inare i signi)icati s eciali da uno o i@ caratteri quando non si desidera un tratta*ento s eciale. -ash i* iega vari *etodi di es ansione dei dati inseriti nella riga di co*ando er decidere quali co*andi eseguire.
71
3.*. ;sercizi
Per questo esercizio dovrete leggere le agine *an di useradd, erch stia*o er usare la directorG /etc/skel er conservare i )ile rede)initi della con)igurazione della shell, che vengono co iati nella directorG ersonale di ogni utente a ena aggiunto. Per ri*a cosa eseguire*o alcuni esercizi generali sulla de)inizione e la variabili. resentazione delle
1. Create 3 variabili, VAR1, VAR2 e VAR3N inizializzatele er tenere ris ettiva*ente i valori [tredici[, [13[ e [-uon co* leanno[. 2. =ostrate i valori di tutte tre le variabili. 3. 9ueste sono variabili locali o globali? #. 'i*uovete VAR3. $. Potete vedere le restanti due variabili in una nuova )inestra di ter*inale? &. =odi)icate /etc/profile in *odo che tutti gli utenti vengano salutati al *o*ento della autenticazione H rovate questoI. 7. Per l:account root, i* ostate l:invito con qualcosa co*e [PericoloVV root sta )acendo cose in U>[, re)eribil*ente in un colore vivace co*e il rosso o rosa, o ure in *odalit! video invertito. ". 1ccertatevi che anche gli utenti a ena creati abbiano un invito ersonalizzato carino che li in)or*i su quale directorG di quale siste*a stiano lavorando. 2 eri*entate le vostre *odi)iche aggiungendo un nuovo utente ed autenticandovi co*e quello. %. 2crivete uno scri t in cui assegnate due valori interi a due variabili. 8o scri t dovrebbe calcolare la su er)icie di un rettangolo che ha queste *isure. +ovrebbe essere corredato di co**enti e generare dei risultati eleganti. Non scordatevi di a licare chmod ai vostri scri tV
72
Tabella <#1: &peratori delle e pre ioni regolari Gperatore %ffetto . ? ^ ] aNc aN,c aN.=c < Corris onde ad ogni carattere. 8:oggetto che recede 3 o zionale e sar! )atto corris ondere al*eno una volta. 8:oggetto che recede sar! )atto corris ondere da zero a i@ volte. 8:oggetto che recede sar! )atto corris ondere da una a i@ volte. 8:oggetto che recede sar! )atto corris ondere esatta*ente N volte. 8:oggetto che recede sar! )atto corris ondere da N a i@ volte. 8:oggetto che recede sar! )atto corris ondere al*eno N volte, *a non i@ di = volte. 'a resenta l:intervallo se non 3 il ri*o o l:ulti*o di un elenco o il unto )inale di un 73
intervallo in un elenco. g \ Ub UUe UT Corris onde alla stringa vuota all:inizio di una linea. 'a resenta anche i caratteri non co* resi nell:intervallo della lista. Corris onde alla stringa vuota alla )ine di una riga. Corris onde alla stringa vuota all:estre*it! di una arola. Corris onde alla stringa vuota )ornita che non 3 all:edge della arola. Corris onde alla stringa vuota all:inizio della arola. Corris onde alla stringa vuota alla )ine della arola.
+ue es ressioni regolari ossono essere concatenate7 la risultante es ressione regolare corris onde a qualsiasi stringa )or*ata concatenando le due sottostringhe che corris ondono ris ettiva*ente alle due sottoes ressioni concatenate. +ue es ressioni regolari ossono essere unite con l:o eratore in)iA [X[7 la risultante es ressione regolare corris onde ad ogni stringa coincidente con entra*be le sottoes ressioni. 8a ri etizione ha la recedenza sul concatena*ento, il quale invece ha la recedenza sull:alternanza. 5na sottoes ressione intera uE essere racchiusa tra arentesi er scavalcare queste regole di recedenza.
1lcuni ese* i7
cathy ~> grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin cathy ~> grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin cathy ~> grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC user:/:/bin/false7 nscd:x:28:28:NSCD Daemon:/:/bin/false named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false cathy ~> grep -c false /etc/passwd 7 cathy ~> grep -i ps ~/.bash* | grep -v history /home/cathy/.bashrc:PS1="\[\033[1;44m\]$USER is in \w\[\033[0m\] "
Con il ri*o co*ando l:utente cath! *ostra dal )ile /etc/passwd le linee contenenti la stringa root. Poi *ostra i nu*eri di linea contenenti questa stringa di ricerca. Con il terzo co*ando controlla quali utenti non stanno bash, *a gli acccount con la shell nologin non vengono *ostrati. 9uindi conta il nu*ero di account che hanno /bin/false co*e shell. 8:ulti*o co*ando *ostra le linee da tutti i )ile nella sua directorG ersonale che iniziano con ~/.bash, escludendo le coincidenze con la stringa hi tor!, in *odo da tralasciare i con)ronti con ~/.bash_history che otrebbe contenere la *edesi*a stringa, in *aiuscolo o in *inuscolo. .ate attenzione che la ricerca 3 er la tringa [ s[ e non er il comando ps. ,ra vedia*o che cos:altro ossia*o )are con gre , utilizzando le es ressioni regolari.
7$
2e desideria*o vedere quali account non hanno er nulla una shell assegnata, cerchia*o linee che ter*inano con [7[7
cathy ~> grep :$ /etc/passwd news:x:9:13:news:/var/spool/news:
Per controllare che PATH venga es ortato in ~/.bashrc, selezionate ri*a le linee [eA ort[ e oi cercate quelle che iniziano con la stringa [P1/B[, in *odo da non *ostrare MANPATH e d altri ossibili ercorsi7
cathy ~> grep export ~/.bashrc | grep '\<PATH' export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"
In *aniera si*ile, UT corris onde alla )ine di una arola. 2e volete trovare una stringa che sia una arola se arata Hracchiusa tra s aziI, 3 *eglio utilizzare la -w, co*e in questo ese* io in cui *ostria*o delle in)or*azioni sulla artizione di root7
cathy ~> grep -w / /etc/fstab LABEL=/ / ext3 defaults 1 1
2e non si usa l:o zione, saranno *ostrate tutte le linee dalla tabella del )ile sGste*.
7&
2e volete *ostrare le linee contenenti il carattere letterale unto, usate l:o zione -F con grep. Per co* arare *olte lici caratteri, usate l:asterisco. 9uesto ese* io seleziona tutte le arole che iniziano con [c[ e ter*inano con [h[ nel dizionario di siste*a7
cathy ~> grep '\<c.*h\>' /usr/share/dict/words caliph cash catch cheesecloth cheetah --output omesso--
2e desiderate trovare il carattere letterale asterisco in un )ile o nei dati in uscita, usate degli a ici singoli. Nell:ese* io seguente CathG ri*a rova a trovare il carattere asterisco in /etc/profile senza usare gli a ici, cosa che non restituisce alcuna linea. 5sando gli a ici viene rodotto un risultato7
cathy ~> grep * /etc/profile cathy ~> grep '*' /etc/profile for i in /etc/profile.d/*.sh ; do
Co*e gi! sa ete, l:asterisco H^I e il unto di do*anda H?I corris ondono ris ettiva*ente a qualsiasi stringa ed a qualsiasi singolo carattere. Ponete )ra a ici questi caratteri s eciali er )arli corris ondere alla lettera7
cathy ~> touch "*" cathy ~> ls "*" *
Potete usare anche le arentesi quadre er con)rontare ogni carattere o intervallo di caratteri inclusi, se le co ie di caratteri sono se arati da un trattino. 5n ese* io7
cathy ~> ls -ld [a-cx-z]* drwxr-xr-x 2 cathy drwxrwxr-x 4 cathy drwxrwxr-x 2 cathy drwxr-xr-x 7 cathy drwxrwxr-x 3 cathy cathy cathy cathy cathy cathy 4096 4096 4096 4096 4096 Jul 20 2002 app-defaults/ May 25 2002 arabic/ Mar 4 18:30 bin/ Sep 2 2001 crossover/ Mar 22 2002 xml/
CiE elenca tutti i )ile nella directorG ersonale di cath!, iniziando da [a[,[b[, [c[, [A[, [G[, o [z[. 2e il ri*o carattere tra arentesi 3 [V[ o [g[, verr! co* arato qualsiasi carattere non incluso. Per con)rontare il trattino H[<[I, includetelo co*e ri*o o ulti*o carattere dell:insie*e. 8:ordina*ento di ende dall:a*biente corrente e dal valore della variabile LC_COLLATE, se i* ostata. 'icordatevi che altri a*bienti otrebbero inter retare [Ja<cA<zK[ co*e [Ja-bCcFALGhzK[ se l:ordina*ento viene eseguito in ordine del dizionario. 2e volete essere sicuri di avere l:inter retazione tradizionale degli intervalli, )orzatene questo co* orta*ento i* ostando LC_COLLATE o LC_ALL a [C[.
4096 Sep 30 2001 Nautilus/ 4096 Jul 11 2002 OpenOffice.org1.0/ 997376 Apr 18 15:39 Schedule.sdc
9uando 3 attiva l:o zione di shell extglob Hutilizzando l:integrato shoptI, vengono riconosciuti diversi o eratori estesi di co* arazione dei *odelli. 8eggete di i@ nelle agine in)o di -ash, sezione -asic shell )eatures<T2hell 6A ansions<T.ilena*e 6A ansion<TPattern =atching.
7"
#.#. 3o))ario
8e es ressioni regolari sono degli stru*enti otenti er selezionare delle linee articolari dai )ile o dai dati in uscita. =olti co*andi 5NIF usa es ressioni regolari7 im, perl, il database Postgre298 e cosD via. 2i ossono *ettere a dis osizione in qualsiasi linguaggio o a licazione utilizzando librerie esterne e si sono di))use anche nei siste*i non 5NIF. Per ese* io, le es ressioni regolari sono utilizzate nel )oglio elettronico 6Acel che viene )ornito con la suite =icroso)t Cindo>s ,))ice. In questo ca itolo abbia*o reso con)idenza con il co*ando grep, che 3 )onda*entale in qualsiasi a*biente 5NIF. Il co*ando grep uE )are di i@ ris etto ai ochi co* iti che qui abbia*o tratttato7 l:abbia*o usato soltanto co*e ese* io er le es ressioni regolari. 8a versione 4N5 di grep giunge con dovizia di docu*entazione, che siete calda*ente consigliati di leggereV -ash ha delle )unzionalit! integrate er co* arare *odelli e uE riconoscere classi e intervalli di caratteri.
#.$. ;sercizi
9uesti esercizi vi aiuteranno a adroneggiare le es ressioni regolari. 1. 2. 3. #. $. &. 7. ". %. 1(. 11. 12. =ostrate un elenco di tutti gli utenti nel vostro siste*a che si sono autenticati con la shell -ash co*e rede)inita. +alla directorG /etc/group/ *ostrate tutte le linee che iniziano con la stringa [dae*on[. 2ta* ate tutte le linee dallo stesso )ile che non contengono la stringa recedente. =ostrate le in)or*azioni di localhost dal )ile /etc/hosts, il nu*ero di linee che soddis)ano la stringa di ricerca e contate quante volte ricorre la stringa. =ostrate un elenco delle sottodirectorG /usr/share/doc contenenti in)or*azioni sulla shell. 9ueste sottodirectorG quanti )ile README contengono? Non contate nulla che abbia la )or*a di ['61+=6.unaMstringa[. .ate un elenco dei )ile della vostra directorG ersonale che sono stati *odi)icati *eno di 1( ore )a, utilizzando grep, *a tralasciando le directorG. =ettere questi co*andi in uno scri t di shell che generi dei risultati co* rensibili. Potete trovare un:alternativa a -c -1 utilizzando grep? 5sando la tabella del )ile sGste* H er ese* io, etc/fstabI, elencate le unit! disco locali. 'ealizzate uno scri t che veri)ichi se un utente esiste in /etc/passwd. Per ora otete s eci)icare il no*e utente nello scri t, non dovete lavorare con argo*enti e condizioni in questa )ase. =ostrate i )ile di con)igurazione in /etc contenenti nu*eri nei loro no*i.
7%
$.1. Introduzione
$.1.1. Che cosa 4 sed
5no 2trea* 6+itor Heditor di )lussiI si usa er eseguire delle se* lici tras)or*azioni in testi da un )ile o da un incanala*ento H pipeI. Il risultato viene inviato allo standard out ut. 8a sintassi del co*ando sed non ha s eci)iche di un )ile in uscita, *a i risultati si ossono salvare in un )ile utilizzando la redirezione dei dati in uscita. 8:editor non *odi)ica gli originali dati in ingresso. CiE che distingue sed da altri editor, co*e i e ed, 3 la sua ca acit! di )iltrare testi che riceve da )onti di incanala*ento. Non vi serve interagire con l:editor *entre sta )unzionando7 questo 3 il *otivo er cui sed talvolta viene de)inito un batch editor. /ale caratteristica consente di utilizzare dei co*andi di *odi)ica negli scri t, se* li)icando enor*e*ente i co* iti ri etitivi di revisione. 9uando si resenta la necessit! di sostituire del testo in un grande nu*ero di )ile, sed 3 di grande aiuto.
"(
Tabella =#1 ) comandi di ed per la modifica )omando aU cU d iU r s > Fisultato 1ggiunge HappendI del testo sotto la linea corrente. Ca*bia HchangeI il testo nella linea corrente con quello nuovo. Cancella HdeleteI il testo. Inserisce Hin ertI il testo al di so ra della linea corrente. 2ta* a HprintI il testo. 8egge HreadI un )ile. 'icerca H earchI e sostituisce un testo. 2crive H$riteI in un )ile.
1 arte la *odi)ica dei co*andi, otete assegnare delle o zioni a sed. Nella tabella successiva c:3 una anora*ica7 Tabella =#. &pzioni di ed Gp1ione -e SCRIPT -f -n -V %ffetto 1ggiunge il co*andi in 2C'IP/ all:insie*e dei co*andi da )ar )unzionare *entre si stanno elaborando i dati in ingresso. 1ggiunge i co*andi contenuti nel )ile 2C'IP/<.I86 all:insie*e dei co*andi da )ar )unzionare *entre si stanno elaborando i dati in entrata. =odo silenzioso. 2ta* a le in)or*azioni sulla versione ed esce.
8e agine in)o di sed contengono *aggiori in)or*azioni7 qui elenchia*o solo i co*andi e le o zioni utilizzati i@ )requente*ente.
0oglia*o sed er trovare le linee che contengono il nostro *odello di ricerca, in questo caso Ca itolo $. 8:editor di )lussi 4N5 sed "1
Co*e otete osservare, sed sta* a il )ile intero, *a le linee contenenti la stringa di ricerca vengono sta* ate due volte. Non 3 ciE che voglia*o. Per sta* are sola*ente quelle linee che soddis)ano il nostro *odello, utilizzia*o l:o zione -n7
sandy ~> sed -n '/erori/p' esempio E' un testo con erori. Molti erori. Cos tanti erori. Tutti questi erori mi fanno impazzire. sandy ~>
Il co*ando d agisce escludendo la ra resentazione delle linee. 8e linee con)rontate che iniziano con un certo *odello e ter*inano con un secondo *odello vengono *ostrate in questo *odo7
sandy ~> sed -n '/^Questa.*errori.$/p' esempio Questa una linea che non contiene errori. sandy ~>
Notate che l:ulti*o unto deve essere receduto da un carattere di esca e er oterlo real*ente con)rontare. Nel nostro ese* io l:es ressione con)ronta se* lice*ente qualsiasi carattere, co* reso l:ulti*o unto.
sed '2,4d' esempio la prima linea di un testo di esempio. una linea che non contiene errori. l'ultima linea.
Per sta* are il )ile artendo da una certa linea sino alla )ine del )ile, utilizzate un co*ando si*ile a questo7
sandy ~> sed '3,$d' esempio Questa la prima linea di un testo di esempio. E' un testo con erori. sandy ~>
CiE sta* a sola*ente le ri*e due linee del )ile di ese* io. Il co*ando seguente sta* a la ri*a linea che contiene il *odello [un testo[, )ino a e co* rendendo la successiva linea contenente il *odello [una linea[7
sandy ~> sed -n '/un testo/,/una linea/p' esempio Questa la prima linea di un testo di esempio. E' un testo con erori. Molti erori. Cos tanti erori. Tutti questi erori mi fanno impazzire. Questa una linea che non contiene errori. sandy ~>
Co*e otete vedere, questo non 3 esatta*ente l:e))etto desiderato7 nella linea # solo la ri*a ricorrenza della stringa di ricerca 3 stata sostituita e lD er*ane ancora un [erore[. 5tilizzate il co*ando g er indicare a sed che dovrebbe esa*inare la linea intera invece di )er*arsi alla ri*a ricorrenza della vostra stringa7
sandy ~> sed 's/erori/errori/g' esempio Questa la prima linea di un testo di esempio. E' un testo con errori. Molti errori. Cos tanti errori. Tutti questi errori mi fanno impazzire. Questa una linea che non contiene errori. Questa l'ultima linea. sandy ~>
Per inserire una stringa all:inizio di ogni linea, ad ese* io er *ettere gli a ici7 Ca itolo $. 8:editor di )lussi 4N5 sed "3
sandy ~> sed 's/^/> /' esempio > Questa la prima linea di un testo di esempio. > E' un testo con erori. > Molti erori. > Cos tanti erori. Tutti questi erori mi fanno impazzire. > Questa una linea che non contiene errori. > Questa l'ultima linea. sandy ~>
I co*andi *ulti li di ricerca e sostituzione sono se arati con singole o zioni -e:
sandy ~> sed -e 's/erori/errori/g' -e 's/ultima/ultimissima/g' esempio Questa la prima linea di un testo di esempio. E' un testo con errori. Molti errori. Cos tanti errori. Tutti questi errori mi fanno impazzire. Questa una linea che non contiene errori. Questa l'ultimissima linea. sandy ~>
/enete in *ente che nor*al*ente sed sta* a i suoi risultati nell:uscita standard, *olto robabil*ente la vostra )inestra di ter*inale. 2e desiderate salvare in un )ile i dati in uscita, redirigeteli7
sed opzione 'qualche/espressione' file_da_elaborare > sed_uscita_verso_un_file
Klteriori esempi 6se* i in quantit! su sed si ossono trovare negli scri t di avvio della vostra *acchina, che nor*al*ente si trovano in /etc/init.d o in /etc/rc.d/init.d. 2 ostatevi nella directorG contenente gli initscri t del vostro siste*a e i* artite il co*ando seguente7 grep sed *
quando si aggiunge o sostituisce un testo, tutte, tranne l:ulti*a, le linee )iniscano con una barra inversa.
$1 contiene il ri*o argo*ento di un dato co*ando, in questo caso il no*e del )ile da convertire7
sandy ~> cat test linea1 linea2 linea3
"$
sandy ~>
9uesto non 3 co*e dovrebbe essere )atto in realt!7 tale ese* io di*ostra sola*ente delle ca acit! di sed. 4uardate la 2ezione &.3 er una soluzione i@ decente di questo roble*a, utilizzando i costrutti 3%')6 e %6D di a-!. sed facile 4li editor avanzati, con su orto della evidenziazione della sintassi, sono in grado di riconoscere la sintassi di sed. CiE uE risultare di grande aiuto se tendete a di*enticare barre inverse e si*ili.
$.#. 3o))ario
8:editor di )lussi sed 3 uno stru*ento otente a linea di co*ando che ha la ca acit! di *aneggiare )lussi di dati7 uE ricevere linee in ingresso da un incanala*ento H pipeI. CiE lo rende adatto ad un uso non interattivo. 8:editor sed usa co*andi si*il< i ed accetta es ressioni regolari. 8o stru*ento sed uE leggere co*andi da linea di co*ando o da uno scri t. 0iene utilizzato s esso er eseguire delle o erazioni cerca<e<sostituisci su linee contenenti un *odello.
$.$. ;sercizi
9uesti esercizi sono diretti a di*ostrare ulterior*ente cosa sed uE )are. 1. 2ta* ate un elenco delle linee nella vostra directorG scripts ter*inanti con [.sh[. 'icordatevi che otreste dover togliere l:alias a ls. =ettete il risultato in un )ile te* oraneo. 2. .ate un elenco dei )ile in ;usr;bin che hanno la lettera [a[ co*e secondo carattere. =ettete il risultato in un )ile te* oraneo. 3. Cancellate le ri*e 3 linee di ogni )ile te* oraneo. #. 2ta* ate nell:uscita standard soltanto le linee contenenti il *odello [an[. $. Create un )ile contenente i co*andi di sed er eseguire i due co* iti recedenti. 1ggiungete a questo )ile un co*ando eAtra che attacchi una stringa co*e [^^^ CiE otrebbe avere qualcosa a che )are con *an e le agine *an ^^^[ nella linea che recede ogni ricorrenza della stringa [*an[. Controllate i risultati. &. 5n lungo elenco della directorG radice, ;,viene usato co*e dato in ingresso. Create un )ile contenente co*andi di sed che veri)ichino collega*enti si*bolici e )ile nor*ali. 2e un )ile 3 un collega*ento si*bolico, )atelo recedere da una linea co*e [<<9uesto 3 un collega*ento si*bolico<<[. 2e il )ile 3 un nor*ale )ile, aggiungete una stringa nella stessa linea con un co**ento co*e [e<<< questo 3 un )ile nor*ale[. 7. Create uno scri t che *ostri le linee contenenti degli s azi bianchi da un )ile. 9uesto scri t dovrebbe utilizzare uno scri t sed e *ostrare delle in)or*azioni sensate all:utente.
"&
/e* o )a negli anni :7( tre rogra**atori decisero di creare questo linguaggio. I loro no*i erano 1ho, Sernighan e Ceinberger. Presero il ri*o carattere di ciascuno dei loro no*i e li *isero assie*e. CosD il no*e del linguaggio avrebbe otuto essere stato tuttal i@ [>a?[.
Nei dati in uscita di ls -l, ci sono % colonne. 8:istruzione print usa questi )ile nel *odo seguente7
kelly@octarine ~/test> ls -l | awk '{ print $5 $9 }' 160orig 121script.sed 120temp_file 126test 120twolines 441txt2html.sh kelly@octarine ~/test>
9uesto co*ando ha sta* ato la quinta colonna di un lungo elenco di )ile, che contiene la di*ensione dei )ile, e l:ulti*a colonna, il no*e del )ile. 9uesti dati in uscita non sono *olto leggibili a *eno che utilizziate il *odo u))iciale di ri)eri*ento alle colonne, che 3 quello di se arare con una virgola quelle che volete sta* are. In tal caso il carattere se aratore di uscita rede)inito, di solito uno s azio, verr! inserito tra ciascun ca* o in uscita. )onfigura1ione locale Notate che la con)igurazione dei dati in uscita del co*ando ls 'l otrebbe essere di))erente nel vostro siste*a. 8a resentazione di ora e data di ende dalle vostre i* ostazioni d:a*biente.
iuttosto scarni. Inserendo una co ia di tabulazioni e una stringa er indicare che ti o di dati sono questi, li render! di as etto *olto i@ gradevole7
kelly@octarine ~/test> ls -ldh * | grep -v total | \ awk '{ print "La dimensione is " $5 " byte per " $9 }' La dimensione 160 byte per orig La dimensione 121 byte per script.sed La dimensione 120 byte per temp_file La dimensione 126 byte per test La dimensione 120 byte per twolines La dimensione 441 byte per txt2html.sh kelly@octarine ~/test>
,sservate l:uso della barra inversa, che )a continuare i lunghi dati in ingresso nella riga successiva senza che la shell inter reti ciE co*e un co*ando se arato. =entre i vostri dati in ingresso nella linea di co*ando ossono essere di lunghezza virtual*ente illi*itata, il vostro *onitor non lo 3, e certa*ente non lo 3 neanche la carta sta* ata. 8:utilizzo della barra inversa consente anche la co ia e l:incollaggio delle linee so rastanti in una )inestra di ter*inale. 8:o zione -h con ls viene usata er )ornire dei )or*ati di*ensionali u*ana*ente leggibili er i )ile i@ grandi. 0iene e*essa una lunga lista che *ostra la quantit! totale dei blocchi nella directorG quando l:argo*ento 3 una directorG. 9uesta linea ci 3 inutile, quindi aggiungia*o un asterisco. 1ggiungia*o ure l:o zione -d er la *edesi*a ragione, nel caso l:asterisco si es anda ad una directorG. 8a barra inversa in questo ese* io segna la continuazione di una linea. 0. 2ezione 3.3.2. Potete estrarre qualsiasi nu*ero di colonne ed anche invertirne l:ordine. Nell:ese* io successivo ciE viene di*ostrato er *ettere in luce le artizioni i@ critiche7
kelly@octarine ~> df -h | sort -rnk 5 | head 5-3 | \ awk '{ print "Partizione " $6 "\t: " $5 " piena!" }' Partizione /var : 86% piena! Partizione /usr : 85% piena! Partizione /home : 70% piena! kelly@octarine ~>
8a tabella sottostante o))re una anora*ica dei caratteri s eciali di )or*attazione7 Tabella >#1/ Caratteri di formattazione per ga$k Se(uen1a Ua Un Ut Significato Carattere ca* anello Carattere nuovalinea /abulazione
1 ici, segni del dollaro ed altri *etacaratteri dovrebbero essere resi con l:esca e di una barra inversa.
5na es ressione regolare si uE usare co*e *odello includendola tra barre. 6ssa viene controllata ris etto al testo intero di ogni record. 8a sintassi 3 co*e segue7
kelly is in ~> df -h | awk '/dev\/hd/ { print $6 "\t: " $5 }' / : 46% /boot : 10% /opt : 84% /usr : 97% /var : 73% /.vol1 : 8% kelly is in ~>
oi
4li a ici devono essere sotto esca e, oich hanno un signi)icato s eciale er il rogra**a in a-!. +i sotto un altro ese* io in cui cerchia*o nella directorG ;etc dei )ile che ter*inano er [.con)[ ed iniziano o con [a[ o con [A[, utilizzando le es ressioni regolari estese7
kelly is in /etc> ls -l | awk '/\<(a|x).*\.conf$/ { print $9 }' amd.conf antivir.conf xcdroast.conf xinetd.conf kelly is in /etc>
9uesto ese* io illustra il signi)icato s eciale del unto nelle es ressioni regolari7 il ri*o indica che voglia*o cercare qualsiasi carattere do o la ri*a stringa di ricerca, il secondo 3 sotto esca e erch )a arte di una stringa da ricercare Hla )ine del no*e del )ileI.
8:istruzione %?@ si uE aggiungere er inserire del testo do o che l:intera i**issione H inputI dei dati 3 stata elaborata7
kelly is in /etc> ls -l | \ awk '/\<[a|x].*\.conf$/ { print $9 } END { print \ "Posso fare qualcosa ancora per lei, signora?" }' amd.conf antivir.conf xcdroast.conf xinetd.conf Posso fare qualcosa ancora per lei, signora? kelly is in /etc>
Per ri*a cosa a-! sta* a un *essaggio iniziale, oi )or*atta tutte le linee che contengono un otto o un nove all:inizio di una arola, seguiti da un altro nu*ero e segno di ercentuale. 2i aggiunge un *essaggio )inale. % iden1ia1ione della sintassi 1>? 3 un linguaggio di rogra**azione. 8a sua sintassi 3 riconosciuta dalla *aggioranza degli editor che eseguono l:evidenziazione della sintassi er altri linguaggi, co*e C, -ash, B/=8, ecc...
l:o eratore di assegnazione b. 2 esso il *o*ento giusto er )are ciE 3 all:inizio dell:esecuzione ri*a che qualsiasi i**issione sia stata elaborata, cosicch ro rio il ri*o record viene letto con il corretto se aratore. Per )are questo, usate il *odello s eciale B%GI?. Nell:ese* io sottostante, realizzia*o un co*ando che *ostri tutti gli utenti nel vostro siste*a con una descrizione7
kelly is in ~> awk 'BEGIN { FS=":" } { print $1 "\t" $5 }' /etc/passwd --output omitted-kelly Kelly Smith franky Franky B. eddy Eddy White willy William Black cathy Catherine the Great sandy Sandy Li Wong kelly is in ~>
2cegliete con attenzione il ca* o di i**issione er evitare roble*i. 5n ese* io er illustrare ciE7 cercate di avere un:i**issione in )or*a di linee che a aia si*ile a questa7 [2andG 8. Cong, &# hoo 2t., 1nt>er , 2(((F[ 2crivete una linea di co*ando o uno scri t che sta* i il no*e della ersona in quel record7 a-! &B%GI? M FSNL/L O M print A1/ AP/ AD O& inputfile =a una ersona otrebbe essere laureata e il record otrebbe essere scritto in questo *odo7 [2andG 8. Cong, Ph+, &# hoo 2t., 1nt>er , 2(((F[ Il vostro a-! )ornir! un:e*issione errata er questa linea. 2e necessario, usate un a-! o sed eAtra er uni)or*are i )or*ati di i**issione dei dati. Il se aratore dei ca* i in ingresso rede)inito 3 uno o i@ s azi bianchi o tabulazioni.
kelly@octarine ~/test> cat test record1 data1 record2 data2 kelly@octarine ~/test> awk '{ print $1 $2}' test record1data1 record2data2 kelly@octarine ~/test> awk '{ print $1, $2}' test record1 data1 record2 data2 kelly@octarine ~/test>
2e non *ettete le virgole, print tratter! le voci in uscita co*e un solo argo*ento, o*ettendo cosD l:uso del eparatore di emi ione rede)inito, OFS. 9ualsiasi stringa di caratteri uE essere utilizzata co*e se aratore di ca* i in e*issione i* ostando questa variabile integrata.
2e il valore di ORS non contiene un nuovalinea, l:e*issione del rogra**a avviene tutta insie*e su una linea singola.
kelly@octarine ~/test> awk -f processed.awk test Record numero 1: record1-data1 --> fatto Record numero 2: record2-data2 --> fatto Numero di record elaborati: 2 --> fatto kelly@octarine ~/test>
kelly@octarine ~> cat totale.awk { totale=totale + $5 } { print "Inviare conto per " $5 " dollari a " $4 } END { print "---------------------------------\nTotale entrate: " total } kelly@octarine ~> awk -f totale.awk test Inviare conto per 2500 dollari a BigComp Inviare conto per 2000 dollari a EduComp Inviare conto per 10000 dollari a SmartComp Inviare conto per 5000 dollari a EduComp --------------------------------Totale entrate: 19500 kelly@octarine ~>
%sempi di a-! nel ostro sistema .accia*o di nuovo ri)eri*ento alla directorG contenente gli initscri t nel vostro siste*a. Inserite un co*ando si*ile al seguente er vedere i@ ese* i ratici dell:uso ad a* io s ettro del co*ando a-!7 grep awk /etc/init.d/*
%.#. 3o))ario
Il rogra**a di utilit! ga-! inter reta un linguaggio di rogra**azione dagli sco i s eciali, gestendo delle se* lici *ansioni di ri)or*attazione dei dati con a ena una *anciata di linee di codice. 6: la versione libera del generale co*ando a-! di 5NIF. 9uesto stru*ento legge linee di dati i**essi e uE riconoscere )acil*ente le e*issioni in colonna. Il rogra**a print 3 il i@ co*une er il )iltraggio e la ri)or*attazione di ca* i de)initi. 8a dichiarazione al volo di variabili 3 diretta e consente se* lici calcoli di so**e, statistiche ed altre o erazioni sul )lusso dei dati i**essi. 0ariabili e co*andi si ossono inserire negli scri t a-! er l:elaborazione di sotto)ondo Hbackground proce ingI. 1ltre cose che dovreste conoscere di a-!7 Il linguaggio resta ben conosciuto su 5NIF e si*ili, *a er l:esecuzione di co* iti si*ili ora si utilizza i@ )requente*ente Perl. /uttavia a-! ha una curva di a rendi*ento i@ accentuata Hsigni)ica che i* arate *olte cosa in un te* o iuttosto ristrettoI. In altri ter*ini, Perl 3 i@ di))icile da a rendere. 2ia Perl che a-! condividono la re utazione di essere inco* rensibili, anche er i reali autori dei rogra**i che usano tali linguaggi. PerciE docu*entate il vostro codiceV
%.$. ;sercizi
9uesti sono alcuni ese* i ratici in cui a-! uE essere utile.
1.
Co*e ri*o esercizio i vostri dati in ingresso sono linee nella )or*a seguente7
Nomeutente:Nome:Cognome:Numero telefonico
'ealizzate uno scri t a-! che converta tali linee in un record 8+1P di questo )or*ato7
dn: uid=Nomeutente, dc=esempio, dc=com cn: Nome Cognome sn: Cognome numerotelefonico: Numero telefonico
2. 'ealizzate uno scri t -ash, utilizzando a-! e i co*andi standard di 5NIF, che *ostri i rinci ali tre utenti dello s azio su disco nel )ilesGste* /home Hse non avete la directorG contenente le directorG ersonali su artizione se arata, create lo scri t er la artizione /7 questa 3 resente in ogni siste*a 5NIFI. Per ri*a cosa eseguite i co*andi da linea di co*ando. 9uindi inseriteli in uno scri t. 8o scri t dovrebbe creare un:e*issione sensata Hsensate er essere letta dal ca oI. 2e tutto si di*ostra )unzionante, )ate in *odo che lo scri t vi invii un *essaggio elettronico con i suoi risultati Hutilizzate, er ese* io, mail -s Uso spazio su disco <voi@vostro_comp> < risultatoI. 2e il de*one quota 3 in )unzione, usate tale in)or*azione, altri*enti usate find. 3. Create un :e*issione in stile F=8 da un elenco se arato da tabulazioni nella )or*a seguente7
Sta per una linea molto lunga con un sacco di descrizione sta per un'altra lunga linea un altro sta per prova sta per una linea pi lunga luuuuuuuuuuuuunga linea, ma proprio luuuuuuuuuuuuuuuuuuuunga
In aggiunta, se sa ete qualcosa di F=8, scrivere uno scri t -64IN e 6N+ er co* letare la tabella o ure )atelo in B/=8. Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %7
'.1. Introduzione a i(
'.1.1. In generale
1lle volte vi serve s eci)icare in uno scri t di shell diverse *odalit! d:azione da intra renderei n base al successo od al )alli*ento di un co*ando. Il costrutto if vi er*ette di s eci)icare tali condizioni. 8a sintassi i@ co* atta del co*ando if 37 if )GQ7?@I'T%ST$ then )GQ7?@I')G?S%GK%?TI$ fi 0iene eseguito l:elenco dei )GQ7?@I'T%ST e, se il suo stato di ritorno 3 zero, viene eseguito anche l:elenco dei )GQ7?@I')G?S%GK%?TI. 8o stato di rientro Hreturn tatu I 3 lo stato di uscita dell:ulti*o co*ando eseguito o zero, se nessuna delle condizioni testate 3 vera. )GQ7?@I'T%ST i* lica s esso test di con)ronti nu*erici o stringa, *a uE essere anche qualsiasi co*ando che restituisce uno stato zero quando ha successo e qualche altro stato quando )allisce. 2 esso si usano le es ressioni unarie er esa*inare lo stato di un )ile. 2e l:argo*ento FILE di una sola delle ri*itive 3 nella )or*a /dev/fd/N, allora viene veri)icato il descrittore di )ile [N[. 1nche stdin, stdout e stderr e i loro ris ettivi descrittori di )ile ossono essere utilizzati er controlli.
%"
0ero se FILE1 e FILE2 si ri)eriscono alla stessa unit! e nu*eri di inode. 0ero se 3 abilitata l:o zione di shell [,P/I,NN1=6[ 0ero se la lunghezza di [2/'IN41[ 3 zero. %%
[-n STRINGA] o [STRINGA] [STRINGA1 == STRINGA2] [STRINGA1 != STRINGA2] [STRINGA1 < STRINGA2] [STRINGA1 < STRINGA2]
ure
0ero se la lunghezza di [2/'IN41[ 3 diversa da zero. 0ero se le stringhe sono uguali. 2i uE usare [b[ al osto di [bb[ er stretta co* atibilit! con P,2IF. 0ero se le stringhe non sono uguali. 0ero se [2/'IN411[ viene ri*a di [2/'IN412[ in ordine al)abetico secondo i ara*etri locali. 0ero se [2/'IN411[ viene do o di [2/'IN412[ in ordine al)abetico secondo i ara*etri locali. [,P[ 3 uno tra -eq, -ne, -lt, -le, -gt o -ge. 9uesti o eratori binari arit*etici restituiscono vero se, ris ettiva*ente, [1'41[ 3 uguale a, diverso da, *inore di, *inore o uguale a, *aggiore di, ovvero *aggiore o uguale a [1'4[. [1'41[ e [1'42[ sono degli interi.
[ARG1 OP ARG2]
8e es ressioni si ossono co*binare utilizzando i seguenti o eratori, elencati in ordine decrescente di recedenza7 Tabella ?#./ Combinazioni di e pre ioni Gpera1ione JV6FP'K JH6FP'IK J6FP'1 <a 6FP'2K J6FP'1 <o 6FP'2K %ffetto 0ero se %R6F 3 )also 'estituisce il valore di %R6F. CiE uE essere usato er scavalcare la nor*ale recedenza degli o eratori. 0ero se %R6F1 ed %R6FP sono entra*bi veri. 0ero se o %R6F1 o %R6FP 3 vero.
8:integrata J Ho testI valuta le es ressioni condizionali usando un insie*e di regole basate sul nu*ero di argo*enti. =aggiori in)or*azioni su questa *ateria si ossono trovare nella docu*entazione di -ash. Pro rio co*e if viene chiuso con fi, la arentesi quadra a erta deve essere chiusa do o l:elencazione delle condizioni.
1((
/uttavia, se utilizzate controlli delle condizioni che di endono dall:a*biente, otreste ottenere dei risultati di))erenti dando lo stesso co*ando in uno scri t, oich quest:ulti*o a rir! una nuova shell in cui le variabili e le o zioni attese otrebbero non essere state de)inite auto*atica*ente.
8:ese* io successivo di*ostra che )GQ7?@I'T%ST otrebbe essere un qualsiasi co*ando 5NIF che restituisca uno stato d:uscita, e che if restituisce nuova*ente uno stato d:uscita ari a zero7
anny ~> if ! grep $USER /etc/passwd More input> then echo "Il tuo account di utente non gestito localmente"; fi Il tuo account di utente non gestito localmente anny > echo $? 0 anny >
anny >
9uesto scri t viene eseguito da cron ogni do*enica. 2e il nu*ero di setti*ana 3 ari, vi ricorda di *ettere )uori il bidone della s azzatura7
#!/bin/bash # Calcola il numero della settimana usando il comando date: NUMSETTIMANA=$[ $(date +"%V") % 2 ] # Controlla se abbiamo un resto. Se non c', questa una settimana pari e perci # invia un messaggio. In caso contrario non fa nulla. if [ $NUMSETTIMANA -eq "0" ]; then echo "Domenica sera: metti fuori i bidoni della spazzatura." | mail -s "Bidoni spazzatura fuori" your@your_domain.fi
1(2
Con -ash, otete abbreviare questo ti o di costrutto. 8:equivalente co* atto della rova so rastante 3 co*e segue7
[ "$(whoami)" != 'root' ] && ( echo stai usando un account non privilegiato; exit 1 )
2i*ile all:es ressione [\\[ che indica cosa )are se la rova da er risultato vero, [XX[ s eci)ica cosa )are se la rova d! )also. 2i ossono usare anche le es ressioni condizionali nei con)ronti7
anny > genere="femminile" anny > if [[ "$genere" == f* ]] Ancora immissione > then echo "Piacere di conoscerla, Signora."; fi Piacere di conoscerla, Signora. anny >
Seri programmatori 8a *aggior arte dei rogra**atori re)erisce usare il co*ando integrato test, che equivale all:uso delle arentesi quadre er i con)ronti, co*e questo7
test "$(whoami)" != 'root' && (echo state usando account senza privilegi; exit 1)
?essuna uscita5 2e invocate e+it in una sottoshell, questa non asser! le variabili a quella genitrice. 5sate a e c al osto di HeI se non volete che -ash si divida in una sottoshell. 0edete le agine in)o di -ash er *aggiori in)or*azione sulle co* arazioni dei *odelli con i costrutti [HH62P'622I,N6II[ e [JJ62P'622I,N6KK.
1(3
Ancora immissione> then echo "Piacere di conoscerla, Signora." Ancora immissione> else echo "Come mai la signora non ha ancora da bere?" Ancora immissione> fi Come mai la signora non ha ancora da bere? freddy scripts>
"# contro ""## Contraria*ente a @, @@ i* edisce la divisione in arole dei valori di variabile. CosD, se 01'b[var con spazi[, non vi serve raddo iare gli a ici a $VAR in una rova O anche se l:uso degli a ici resta una buona abitudine. Inoltre [[ reviene l:es ansione dei no*i di ercorso, er cui le stringhe letterali con *etacaratteri non cercano di es andersi nei no*i dei )ile. 5sando [[, == e != inter retano le stringhe a destra co*e *odelli di glob di shell er con)rontarli ris etto al valore a sinistra, er ese* io7 [[ "valore" == val* ]]/ Co*e l:elenco )GQ7?@I')G?S%GK%?TI che segue l:istruzione then, l:elenco )GQ7?@I' )G?S%GK%?TI'7LT%F?7TISI che segue l:istruzione else uE contenere qualsiasi co*ando che restituisca uno stato d:uscita. 5n altro ese* io che a* lia quello della 2ezione 7.1.2.17
anny ~> su Password: [root@elegance root]# if ! grep ^$USER /etc/passwd 1> /dev/null > then echo "Il tuo account di utente non gestito localmente" > else echo "il tuo account gestito dal file locale /etc/passwd" > fi il tuo account gestito dal file locale /etc/passwd [root@elegance root]#
Passia*o all:account root er *ostrare l:e))etto dell:istruzione else < il vostro root di solito 3 un account locale *entre l:account di utente otrebbe essere gestito da un siste*a centrale, co*e un server 8+1P.
1(#
-igura ?#1/ Controllo di un argomento a linea di comando con if 6cco qui un altro ese* io che usa due argo*enti7
anny ~> cat peso.sh #!/bin/bash # Questo script stampa un messaggio sul vostro peso se glielo date in chili e l'altezza # in centimetri. peso="$1" altezza="$2" pesoideale=$[$altezza - 110] if [ $peso -le $pesoideale ] ; then echo "Dovreste mangiare un poco di grassi in pi." else echo "Dovreste mangiare un poco di frutta in pi." fi anny ~> bash -x peso.sh 55 169 + peso=55 + altezza=169 + pesoideale=59 + '[' 55 -le 59 ']' + echo 'dovreste mangiare un poco di grassi in pi.' Dovreste mangiare un poco di grassi in pi.
1($
exit fi peso="$1" altezza="$2" pesoideale=$[$altezza 110] if [ $peso -le $pesoideale ] ; then echo "Dovreste mangiare un poco di grassi in pi." else echo "Dovreste mangiare un poco di frutta in pi." fi anny ~> peso.sh 70 150 Dovreste mangiare un poco di frutta in pi. anny ~> peso.sh 70 150 33 Uso: $0 peso_in_kili altezza_in_centimetri
Il ri*o argo*ento viene identi)icato co*e $1, il secondo co*e $2 e cosD via. Il nu*ero totale di argo*enti viene conservato in $#. 6sa*inate la 2ezione 7.2.$ er un *odo i@ elegante di sta* are *essaggi sull:utilizzo.
,sservate che il )ile 3 stato ri)erito ad una variabile7 in questo caso 3 il ri*o argo*ento dello scri t. In alternativa, quando non si )orniscono argo*enti, le locazioni dei )ile vengono solita*ente conservate in variabili all:inizio di uno scri t ed al loro contenuto ci si ri)erisce usando le variabili. CosD, quando volete *odi)icare un no*e di un )ile in uno scri t, dovete )arlo una volta sola. ?omi di file con spa1i 8:ese* io so rastante )allir! se il valore di \1 uE essere esa*inato co*e a arole *ulti le. In tal caso il co*ando if va corretto o utilizzando i do i a ici attorno al no*e del )ile, o usando @@ il luogo di @.
1(&
'.2.2.2. ;se)pio
9uesto 3 un ese* io che otete inserire nel vostro crontab er un:esecuzione quotidiana7
anny /etc/cron.daily> cat testdischi.sh #!/bin/bash # Questo script esegue una prova semplicissima per controllare lo spazio su disco. spazio=`df -h | awk '{print $5}' | grep % | grep -v Use | sort -n | tail -1 | cut -d "%" -f1 -` valoreallarme="80" if [ "$spazio" -ge "$valoreallarme" ]; then echo "Almeno uno dei dischi quasi pieno!" | mail -s "test quotidiano dischi" root else echo "Spazio disco normale" | mail -s "test quotidiano dischi" root fi
1(7
1ll:interno dell:istruzione if otete usare un:altra istruzione if. Potete usare tanti livelli di if annidati quanti siete in grado di gestire logica*ente. 9uesto 3 un ese* io veri)ica gli anni bisestili7
anny ~/testdir> cat provabisestili.sh #!/bin/bash # Questo script verificher se siamo o meno in un anno bisestile. anno=`date +%Y` if [ $[$anno % 400] -eq "0" ]; then echo "Questo un anno bisestile. Febbraio ha 29 giorni." elif [ $[$anno % 4] -eq 0 ]; then if [ $[$anno % 100] -ne 0 ]; then echo "Questo un anno bisestile. Febbraio ha 29 giorni." else echo "Questo non un anno bisestile. Febbraio ha 28 giorni." fi else echo "Questo non un anno bisestile. Febbraio ha 28 giorni." fi anny ~/testdir> date Tue Jan 14 20:37:55 CET 2003 anny ~/testdir> provabisestile.sh Questo non un anno bisestile.
-igura ?#./ % empio dell"u o degli operatori booleani Noi utilizzia*o le arentesi do ie er rovare un:es ressione arit*etica Hv. 2ezione 3.#.&I. CiE equivale alla istruzione let. 9ui )inirete nei guai utilizzando delle arentesi quadre se tenterete qualcosa co*e A"Aanno T 2UU# erch in questo caso le arentesi quadre non ra resentano un vero co*ando di er se stesse. .ra gli altri editor, g im 3 uno di quelli che su ortano gli sche*i di colore a seconda del )or*ato del )ile7 tali editor sono utili er sco rire errori nel vostro codice.
1("
9uesto scri t 3 richia*ato nel rossi*o, che d:altra arte es orta le sue variabili menu e animale7
anny ~/testdir> cat cibo.sh #!/bin/bash # Questo script agisce in base allo stato di uscita dato da pinguino.sh export menu="$1" export animale="$2" cibo="/nethome/anny/testdir/pinguino.sh" $cibo $menu $animal case $? in 1)
1(%
echo "Guardia: Meglio che tu dia loro un pesce, altrimenti diventano violenti..." ;; 2) echo "Guardia: E' a causa della gente come te che lasciano la terra tutto il tempo..." ;; 3) echo "Guardia: Compra il cibo che lo Zoo fornisce agli animali, tu ***, come pensi che sopravvivano??" ;; *) echo "Guardia: Non scordare la guida!" ;; esac anny ~/testdir> ./cibo.sh mela pinguino A Tux non piace quello. Tux vuole pesce! Guardia: Meglio che tu dia loro un pesce, altrimenti diventano violenti...
Co*e otete vedere, i codici di stato d:uscita ossono essere scelti libera*ente. +i solito i co*andi esistenti hanno una serie di codici deter*inati7 guardate il *anuale del rogra**atore di ciascun co*ando er *aggiori in)or*azioni.
11(
Messaggio="Meglio sbrigarsi con quel nuovo disco... Una partizione piena al $spazio %." ;; 99) Messaggio="Qui mi sommergono! C' una partizione a $spazio %!" ;; *) Messaggio="Mi sembra di funzionare con una quantit inesistente di spazio su disco..." ;; esac echo $Messaggio | mail -s "rapporto dischi `date`" anny anny ~/testdir> You have new mail. anny ~/testdir> tail -16 /var/spool/mail/anny From anny@octarine Tue Jan 14 22:10:47 2003 Return-Path: <anny@octarine> Received: from octarine (localhost [127.0.0.1]) by octarine (8.12.5/8.12.5) with ESMTP id h0ELAlBG020414 for <anny@octarine>; Tue, 14 Jan 2003 22:10:47 +0100 Received: (from anny@localhost) by octarine (8.12.5/8.12.5/Submit) id h0ELAltn020413 for anny; Tue, 14 Jan 2003 22:10:47 +0100 Date: Tue, 14 Jan 2003 22:10:47 +0100 From: Anny <anny@octarine> Message-Id: <200301142110.h0ELAltn020413@octarine> To: anny@octarine Subject: disk report Tue Jan 14 22:10:47 CET 2003 Inizia a pensare di cancellare qualcosa. C' una partizione piena per 87 %. anny ~/testdir>
Natural*ente dovreste a rire il vostro rogra**a di osta er veri)icare i risultati7 questo 3 solo er di*ostrare che lo scri t invia un decente *essaggio elettronico con linee di intestazione [17[, [,ggetto7[ e [+a7[. =olti altri ese* i dell:uso delle istruzioni case si ossono trovare nella directorG di scri t init del vostro siste*a. 4li scri t di avvio usano i casi start e stop er )ar artire o )er*are i rocessi del siste*a. 5n ese* io teorico si uE trovare nella rossi*a sezione.
111
stop start ;; condrestart) if test "x`pidof anacron`" != x; then stop start fi ;; *) echo $"Uso: $0 {start|stop|restart|condrestart|status}" exit 1 esac
I co* iti da eseguire in ciascun caso, co*e )er*are ed attivare il de*one, sono de)initi nelle )unzioni, che traggono arzial*ente origine dal )ile /etc/rc.d/init.d/functions. 0. il Ca itolo 11 er *aggiori s iegazioni.
'.#. 3o))ario
In questo ca itolo abbia*o i* arato co*e realizzare delle condizioni nei nostri scri t in *odo che di))erenti azioni ossano essere intra rese in base al successo o al )alli*ento di un co*ando. 8e azioni si ossono deter*inare *ediante l:uso dell:istruzione if. CiE vi consente di eseguire con)ronti arit*etici e testuali, e di veri)icare codici d:uscita, i**issioni e )ile necessari agli scri t. 5n se* lice test if;then;fi s esso recede dei co*andi in uno scri t di shell er revenire la generazione di e*issioni, in *odo lo scri t uE essere avviato sullo s)ondo H backgroundI o attraverso il rogra**a di utilit! cron. +e)inizioni i@ co* lesse delle condizioni vengono di solito inserite in una istruzione case.
'.$. ;sercizi
9ui ci sono alcune idee er )arvi iniziare ad usare if negli scri t7 1. 5sate un costrutto if;then;elif;else che sta* i le in)or*azioni sul *ese corrente. 8o scri t dovrebbe sta* are il nu*ero di giorni in questo *ese e )ornire in)or*azioni sugli anni bisestili se il *ese attuale 3 )ebbraio. 2. .ate lo stesso, usando un:istruzione case e un utilizzo alternativo del co*ando date. 3. =odi)icate /etc/profile in *odo da ottenere un *essaggio s eciale di saluto quando vi connettete al siste*a co*e root. #. =odi)icate lo scri t provabisestile.sh della 2ezione 7.2.# in *odo che richieda un unico argo*ento, l:anno. 0eri)icate che venga )ornito esatta*ente un solo argo*ento. $. 2crivete uno scri t chia*ato qualedemone.sh che controlli se i de*oni httpd e init stanno girando nel vostro siste*a. 2e sta )unzionando httpd, lo scri t dovrebbe sta* are un Ca itolo 7. Istruzioni condizionali 112
*essaggio co*e7 [9uesta *acchina sta )acendo girare un server >eb[. 5sate ps controllare i rocessi.
er
&. 2crivete uno scri t che esegua una co ia di sicurezza della vostra directorG ersonale in una *acchina re*ota usando scp. 8o scri t dovrebbe )are ra orto in un )ile di registro, er ese* io ~/log/homebackup.log. 2e non avete una seconda *acchina a cui inviare la co ia, usate scp er rovare a co iare in localhost. CiE richiede chiavi 22B tra i due host, o ure che dobbiate )ornire una ass>ord. 8a creazione di chiavi 22B 3 s iegata in man shh-keygen. 7. 1dattate lo scri t del ri*o ese* io in 2ezione 7.3.1 er includere i casi di uso dello s azio su disco al %(d esatto e *inore del 1(d. 8o scri t dovrebbe usare tar cf er la creazione della co ia di riserva e g1ip o b1ipP er co* ri*ere il )ile .tar. =ettete tutti i no*i di )ile in variabili. =ettete i no*i del server re*oto e della directorG re*ota in variabili. CiE vi se* li)icher! il riutilizzo dello scri t o l:e))ettuazione di *odi)iche su di esso nel )uturo. 8o scri t dovrebbe controllare l:esistenza di un archivio co* resso. 2e esiste, er ri*a cosa ri*uovetelo onde evitare la roduzione di dati in uscita. 8o scri t dovrebbe ure veri)icare lo s azio dis onibile su disco. /enete in *ente che in qualsiasi *o*ento otreste avere i dati nella vostra directorG ersonale, i dati nel )ile .tar e i dati nell:archivio co* resso tutti insie*e nel vostro disco. 2e non ci )osse abbastanza s azio su disco, uscite con un *essaggio d:errore nel )ile di registro. 8o scri t dovrebbe ri ulire l:archivio co* resso ri*a di uscire.
113
Co*e ese* io di aggiunta di co**enti, *igliorere*o un o: i rogra**i cibo.sh e inguino.sh della 2ezione 7.2.1.27
michel ~/test> cat pinguino.sh #!/bin/bash # Lo script vi lascia presentare menu differenti a Tux. Lui sar felice solo quando # gli sar dato un pesce. Per renderlo pi divertente, abbiamo aggiunto in pi una coppia # di animali. if [ "$menu" == "pesce" ]; then if [ "$animale" == "pinguino" ]; then echo -e "Hmmmmmm pesce... Tux felice!\n" elif [ "$animale" == "delfino" ]; then echo -e "\a\a\aPweetpeettreetppeterdepweet!\a\a\a\n" else echo -e "*prrrrrrrt*\n" fi else if [ "$animale" == "pinguino" ]; then echo -e "A Tux non piace quello. Tux vuole pesce!\n" exit 1 elif [ "$animale" == "delfino" ]; then echo -e "\a\a\a\a\a\aPweepwishpeeterdepweet!\a\a\a" exit 2 else echo -e "Sai leggere il segnale?! Non dare da mangiare al "$animale"!\n" exit 3 fi fi michel ~/test> cat cibo.sh #!/bin/bash # Lo script agisce in base allo stato di uscita dato da pinguino.sh if [ "$#" != "2" ]; then echo -e "Uso dello script cibo:\t$0 cibonelmenu animale-nome\n" exit 1 else export menu="$1" export animale="$2" echo -e "Nutriamo con $menu il $animale...\n" cibo="/nethome/anny/testdir/pinguino.sh" $cibo $menu $animale risultato="$?" echo -e "Pasto eseguito.\n"
11$
case "$risultato" in 1) echo -e "Guardia: violenti...\"\n" ;; 2) echo -e "Guardia: ;; 3) echo -e "Guardia: echo -e "Guardia: ;; *) echo -e "Guardia: ;; esac fi echo "Uscendo..." echo -e "\a\a\aGrazie per la visita allo Zoo, speriamo di vedervi presto di nuovo!\n" michel ~/test> cibo.sh mela cammello Nutrire con una mela un cammello... Sai leggere il segnale?! Non dare da mangiare al cammello! Pasto eseguito. Guardia: "Compra il cibo che fornisce lo Zoo all'entrata. Tu ***"" Guardia: "Vuoi avvelenarli sul serio?" Uscendo... Grazie per la visita allo Zoo, speriamo di vedervi presto di nuovo! michel ~/test> cibo.sh mela Uso dello script cibo: ./cibo.sh cibo-in-menu nome-animale \"Sarebbe meglio dare loro un pesce, altrimenti diventano
\"Compra il cibo che fornisce lo Zoo all'entrata. Tu ***\"\n" \"Vuoi avvelenarli sul serio?\"\n"
2i uE trovare di i@ sui caratteri esca e nella 2ezione 3.3.2. 8a tabella seguente o))re una anora*ica delle sequenze riconosciute dal co*ando echo7 Tabella 8-1. Sequenze di escape utilizzate dal comando echo Se(uen1a
\a \b \c \e \ \n \r \t \! \\ \0""" Significato
1llar*e Hca* anelloI. 2 azio indietro o back pace/ 2o ri*e i nuovalinea in *ezzo al testo 6sca e. .or* )eed Nuovalinea 'itorno carrello o C' HCarriage 9eturnI. /abulazione orizzontale /abulazione verticale -arre inverse Il carattere a otto bit il cui valore 3 il valore ottale NNN Hda zero a tre ci)re ottaliI. 11&
\""" \#$$
Il carattere a otto bit il cui valore 3 il valore ottale NNN Hda una a tre ci)re ottaliI. Il carattere a otto bit il cui valore 3 il valore esadeci*ale Huna o due ci)re esadeci*aliI
Per *aggiori in)or*azioni sul co*ando printf ed il *odo in cui vi consente di )or*attare le e*issioni, v. le agine in)o di -ash. /enete in *ente che otrebbero esserci delle di))erenze tra le diverse versioni di -ash.
Tabella A#./ &pzioni dell"integrato read Gp1ione -a ANAME Significato 2i assegnano le arole a indici sequenziali della variabile *atriciale ANAME, iniziante er (. /utti gli ele*enti vengono ri*ossi da ANAME ri*a dell:assegnazione. 1ltri argo*enti NAME vengono ignorati. Il ri*o carattere di +68I= viene usato er ter*inare la linea i**essa, al osto di nuovalinea. readline viene usato er ottenere la linea 117
-d DELIM -e
-n NCHARS
read ritorna do o la lettura dei caratteri NCHARS iuttosto di attendere l:intera linea di i**issione. =ostra PROMPT senza nuovalinea in *ezzo ri*a di tentare di leggere qualsiasi i**issione. 8:invito HpromptI viene *ostrato solo se l:i**issione roviene da un ter*inale. 2e viene data questa o zione, la barra inversa non si co* orta co*e carattere di esca e. 8a barra inversa viene considerata a artenente alla linea. In articolare, una co ia barra inversa<nuovalinea otrebbe non essere utilizzata co*e rosecuzione di linea. =odalit! silenziosa. 2e l:i**issione roviene da un ter*inale, i caratteri non vengono ri ortati con echo. +eter*ina read ad andare )uori te* o *assi*o e a restituire un )alli*ento se non 3 stata letta una linea intera entro i secondi di TIMEOUT. /ale o zione non ha e))etti se read non sta leggendo i**issioni da ter*inale o da un incanala*ento HpipeI. 8egge i**issioni dal descrittore di )ile FD.
-p PROMPT
-r
-s
-t TIMEOUT
-u FD
9uesto 3 un chiaro ese* io che *igliora lo scri t provabisestile.sh del recedente ca itolo7
michel ~/test> cat leaptest.sh #!/bin/bash # Questo script verificher se avete dato un anno bisestile o meno. echo "Batti l'anno che desideri controllare (4 cifre), seguito da [INVIO]:" read anno if (( ("$anno" % 400) == "0" )) || (( ("$anno" % 4 == "0") && ("$anno" % 100 != "0") )); then echo "$anno un anno bisestile." else echo "Tquesto non un anno bisestile." fi michel ~/test> provabisestile.sh Batti l'anno che desideri controllare (4 cifre), seguito da [INVIO]: 2000 2000 un anno bisestile.
11"
read -n 1 genere echo grep -i "$nome" "$amici" if [ $? == 0 ]; then echo "Sei gi registrato, chiusura in corso." exit 1 elif [ "$genere" == "m" ]; then echo "Sei stato aggiunto alla lista degli amici di Michel." exit 1 else echo -n "Quanti anni hai? " read anni if [ $anni -lt 25 ]; then echo -n "Di che colore sono i tuoi capelli? " read colore echo "$nome $anni $colore" >> "$amici" echo "Sei stato aggiunto alla lista degli amici di Michel. Tante grazie!" else echo "Sei stato aggiunto alla lista degli amici di Michel." exit 1 fi fi michel ~/test> cp amici.sh /var/tmp; cd /var/tmp michel ~/test> touch amici; chmod a+w amici michel ~/test> amici.sh Ciao, michel. Questo script ti registrer nel database degli amici di Michel. Inserisci il tuo nome e premi [INVIO]:michel Inserisci il tuo genere (maschio/femmina) e premi [ENTER]: :m Sei stato aggiunto alla lista degli amici di Michel. michel ~/test> cat amici
Notate che qui non 3 stato o*esso alcun risultato. 8o scri t conserva solo le in)or*azioni che interessano a =ichel, *a vi dir! se* re che siete stati aggiunti alla lista, a *eno che non ci siate gi!. ,ra altre ersone ossono eseguire lo scri t7
[anny@octarine tmp]$ amici.sh Ciao, anny. Questo script ti registrer nel database degli amici di Michel. Inserisci il tuo nome e premi [INVIO]:anny Inserisci il tuo genere (maschio/femmina) e premi [ENTER]: :f Quanti anni hai? 22 Di che colore sono i tuoi capelli? nero Sei stato aggiunto alla lista degli amici di Michel.
Natural*ente tale situazione non 3 ideale dal *o*ento che chiunque uE *odi)icare H*a non cancellareI i )ile di =ichel. Potete risolvere questo roble*a utilizzando delle s eciali *odalit! di accesso al )ile dello scri t Hv. SKI@ e SGI@ nella guida [Introduzione a 8inuA[I.
11%
Notate che ciascun rocesso ha la ro ria visione dei )ile sotto /proc/self, che in realt! 3 un collega*ento si*bolico a /proc/<ID_processo>. 0i otrebbe tornare interessante rovare info Q7V%@%S e info proc er *aggiori in)or*azioni sulle sottodirectorG /proc ed il *odo in cui il vostro siste*a gestisce i descrittori di )ile standard er ciascun rocesso in )unzione. 9uando si esegue un dato co*ando, vengono ercorse le seguenti )asi, nell:ordine7 2e l:e*issione standard H tandard outputI di un recedente co*ando 3 stata incanalata nell:i**issione standard H tandard inputI del co*ando corrente, allora /proc/<ID_processo_corrente>/fd/0 viene aggiornato er diretto verso lo stesso incanala*ento anoni*o co*e /proc/<ID_processo_precedente>/fd/1. 2e l:e*issione standard del co*ando corrente viene incanalata verso l:i**issione standard del co*ando successivo, allora /proc/<ID_processo_corrente>/fd/1 viene aggiornato er essere destinato ad un altro incanala*ento anoni*o. 8a redirezione del co*ando corrente viene elaborata da sinistra a destra. 8a redirezione [NTf=[ o [Nef=[ do o un co*ando ha l:e))etto di creare o aggiornare il collega*ento si*bolico /proc/self/fd/N con la stessa destinazione del collega*ento si*bolico /proc/self/fd/M. Ca itolo ". 'edigere scri t interattivi 12(
8a chiusura [NTf<[ del descrittore di )ile ha l:e))etto di cancellare il collega*ento si*bolico /proc/self/fd/N. 2olo ora viene eseguito il co*ando corrente. 9uando avviate uno scri t dalla linea di co*ando, non ca*bia i@ nulla erch il rocesso shell )iglio user! gli stessi descrittori di )ile di quello genitore. 9uando non 3 dis onibile un tale genitore, er ese* io quando avviate uno scri t utilizzando il rogra**a di utilit! cron, i descrittori di )ile standard sono incanala*enti o altri )ile Hte* oraneiI, a *eno che non venga utilizzata una qualche )or*a di redirezione. 9uesto viene ra resentato nell:ese* io sottostante, che *ostra un:e*issione da un un se* lice scri t at7
michel ~> date Fri Jan 24 11:05:50 CET 2003 michel ~> at 1107 warning: commands will be executed using (in order) a) $SHELL b) login shell c)/bin/sh at> ls -l /proc/self/fd/ > /var/tmp/fdtest.at at> <EOT> job 10 at 2003-01-24 11:07 michel ~> cat /var/tmp/fdtest.at total 0 lr-x------ 1 michel michel 64 Jan l-wx------ 1 michel michel 64 Jan l-wx------ 1 michel michel 64 Jan lr-x------ 1 michel michel 64 Jan
24 24 24 24
0 1 2 3
0 1 2 3
121
rediriger! l:e*issione standard del co*ando ls verso il )ile inaccessibile-in-spool in /var/tmp. Il co*ando
ls -l * > /var/tmp/listaspool 2>&1
diriger! sia i**issione che errori standard verso il )ile listaspool. Il co*ando
ls -l * 2 >& 1 > /var/tmp/listaspool
dirige solo l:e*issione standard verso il )ile di destinazione, erch l:errore standard viene co iato nell:e*issione standard ri*a che questa sia rediretta. Per co*odit!, s esso gli errori vengono rediretti verso /dev/null se 3 certo che non servano. 2i ossono trovare centinaia di ese* i nei )ile di avvio del vostro siste*a. -ash er*ette sia all:e*issione standard che all:errore standard di essere rediretti verso il )ile il cui no*e 3 il risultato dell:es ansione di FILE con questo costrutto7 &> FILE CiE 3 l:equivalente di >FILE 2>&1, il costrutto usato nel recedente co* lesso di ese* i. 6sso s esso viene co*binato anche con la redirezione verso /dev/null, er ese* io quando volete solo eseguire un co*ando, non i* orta quali e*issioni o errori dia.
Il co*ando cat er ri*a cosa legge il )ile testata.txt, oi la sua i**issione standard che 3 l:e*issione del co*ando filter e, er ulti*o, il )ile piepagina.txt. 8o s eciale signi)icato del trattino co*e argo*ento di linea di co*ando er )are ri)eri*ento all:i**issione standard o Ca itolo ". 'edigere scri t interattivi 122
all:e*issione standard 3 un:idea sbagliata che si 3 insinuata in *olti rogra**i. Ci otrebbero essere anche roble*i quando si s eci)ica il trattino co*e ri*o argo*ento, dal *o*ento che otrebbe essere inter retato co*e una o zione del co*ando recedente. 8:uso di /dev/fd consente uni)or*it! e reviene la con)usione7
michel ~> filter corpo.txt.gz | cat testata.txt /dev/fd0 piepagina.txt | lp
In questo chiaro ese* io, tutti i dati in uscita vengono er di i@ incanalati attraverso lp er inviarli alla sta* ante rede)inita.
5n:altra *aniera er osservare i descrittori dei )ile 3 di ensarli co*e un *ezzo er assegnare un valore nu*erico ad un )ile. Invece di usare il no*e del )ile, otete usare il nu*ero del descrittore del )ile. Il co*ando integrato e+ec uE essere utilizzato er ri* iazzare la shell del rocesso corrente o er alterare i descrittori dei )ile della shell corrente. Per ese* io, uE essere i* iegato er assegnare un descrittore di )ile ad un )ile. 5sate e+ec fd?I file er assegnare il descrittore di )ile N a )ile er l:e*issione e e+ec fd?H file er assegnare il descrittore di )ile N ad un )ile er l:i**issione. +o o che un descrittore di )ile 3 stato assegnato ad un )ile, esso uE essere utilizzato con gli o eratori di redirezione della shell, co*e 3 di*ostrato nell:ese* io seguente7
michel ~> exec 4> risultati.txt michel ~> filter corpo.txt.gz | cat testata.txt /dev/fd/0 piepagina.txt >& 4 michel ~> cat risultati.txt Questo testo viene stampato all'inizio di ogni lavoro di stampa e ringrazia l'amministratore di sistema per averci predisposto una infrastruttura di stampa cos grande. Testo da filtrare. Questo testo viene stampato alla fine di ciascun lavoro di stampa.
@escrittore di file W 8:uso di questo descrittore dei )ile otrebbe causare dei roble*i, v. [1dvanced -ash< 2cri ting 4uide[, ca itolo 1&. 2iete )orte*ente consigliati di non usarlo.
*.2.#.2.2.
9uello seguente 3 un ese* io che *ostra co*e otete alternare i**issione di )ile ad i**issione tra*ite linea di co*ando7
michel ~/testdir> cat notesistema.sh #!/bin/bash # Questo script crea un indice dei file config importanti, li mette insieme in un file # di salvataggio e consente di aggiungere commenti a ciascun file. CONFIG=/var/tmp/sysconfig.out rm "$CONFIG" 2>/dev/null echo "L'emissione sar salvata in $CONFIG." # crea fd 7 con la stessa destinazione di fd 0 (salva il "valore" stdin) exec 7<&0 # aggiorna fd 0 al file di destinazione /etc/passwd exec < /etc/passwd # Legge la prima linea di /etc/passwd read rootpasswd echo "Salvataggio informazioni su account di root..." echo "Le informazioni sul tuo account di root:" >> "$CONFIG" echo $rootpasswd >> "$CONFIG" # aggiorna fd 0 per puntare alla destinazione fd 7 (vecchia destinazione di fd 0); # cancella fd 7 exec 0<&7 7<&echo -n "Inserire un commento o [INVIO] per nessun commento: " read commento; echo $commento >> "$CONFIG" echo "Salvataggio informazioni degli host..." # Per primo prepara un file hosts privo di commenti TEMP="/var/tmp/hosts.tmp" cat /etc/hosts | grep -v "^#" > "$TEMP" exec 7<&0 exec < "$TEMP" read ip1 nome1 alias1 read ip2 nome2 alias2 echo "La tua configurazione locale di host:" >> "$CONFIG" echo "$ip1 $nome1 $alias1" >> "$CONFIG" echo "$ip2 $nome2 $alias2" >> "$CONFIG" exec 0<&7 7<&echo -n "Inserire un commento o [INVIO] per nessun commento: " read commento; echo $commento >> "$CONFIG" rm "$TEMP" michel ~/testdir> notesistema.sh L'emissione sar salvata in /var/tmp/sysconfig.out. Salvataggio informazioni su account di root... Inserire un commento o [INVIO] per nessun commento: password suggerita: blue lagoon Salvataggio informazioni degli host... Inserire un commento o [INVIO] per nessun commento: in DNS centrale michel ~/testdir> cat /var/tmp/sysconfig.out Le informazioni sul tuo account di root: root:x:0:0:root:/root:/bin/bash password suggerita: blue lagoon La tua configurazione locale di host:
12#
12$
# Inizia il documento here cat << BROWSERS mozilla links lynx konqueror opera netscape BROWSERS # Fine del documento here echo -n "Quale preferisci? " read browser echo "Avvio $browser, attendi per favore..." $browser & michel ~> inizionavigazione.sh Questi sono i programmi di navigazione internet di questo sistema: mozilla links lynx konqueror opera netscape Quale preferisci? opera Avvio opera, attendi per favore...
2ebbene si arli di un docu*ento here, si su one che si tratti di un costrutto all:interno dello stesso scri t. 9uesto 3 un ese* io che installa auto*atica*ente un acchetto, anche se nor*al*ente dovreste con)er*are7
#!/bin/bash # Questo script installa i pacchetti automaticamente, usando yum. if [ $# -lt 1 ]; then echo "Uso: $0 pacchetti." exit 1 fi yum install $1 << CONFIRM y CONFIRM
6 questo 3 co*e )unziona lo scri t. 9uando a are l:invito con la stringa [Is this o? JG;NK[, lo scri t ris onde [G[ auto*atica*ente7
[root@picon bin]# ./install.sh tuxracer Gathering header information file(s) from server(s) Server: Fedora Linux 2 - i386 - core Server: Fedora Linux 2 - i386 freshrpms Server: JPackage 1.5 for Fedora Core 2 Server: JPackage 1.5, generic Server: Fedora Linux 2 - i386 - updates Finding updated packages Downloading needed headers Resolving dependencies Dependencies resolved I will do the following: [install: tuxracer 0.61-26.i386] Is this ok [y/N]: EnterDownloading Packages Running test transaction: Test transaction complete, Success! tuxracer 100 % done 1/1 Installed: tuxracer 0.61-26.i386 Transaction(s) Complete
12&
*.3. 3o))ario
In questo ca itolo abbia*o i* arato a )ornire dei co**enti dell:utente e a invitare all:i**issione da arte dello stesso. CiE nor*al*ente si )a utilizzando la co*binazione echo;read. 1bbia*o trattato ure di co*e i )ile ossono essere utilizzati co*e i**issione o e*issione ricorrendo ai descrittori di )ile e alla redirezione, e di co*e questi ossano essere co*binati con la ricezione di dati in ingresso dall:utente. 1bbia*o ribadito l:i* ortanza del )ornire *essaggi esaurienti agli utenti dei nostri scri t. Co*e se* re, quando altri usano i vostri scri t, 3 *eglio dare tro e in)or*azioni iuttosto che insu))icienti. i docu*enti here sono un ti o di costrutto di shell che consente la creazione di elenchi, *antenendo le scelte degli utenti. /ale costrutto si uE usare anche er eseguire senza interventi co* iti di sotto)ondo, altri*enti interattivi.
*.#. ;sercizi
9uesti esercizi sono a licazioni ratiche di costrutti trattati in questo ca itolo. 9uando si scrivono degli scri t, otreste rovarli utilizzando una directorG test che non contenga tro i dati. 2crivete ciascun asso, indi rovate quella orzione di codice iuttosto di scrivere tutto in una sola volta. 1. 2crivete un scri t che chieda l:et! dell:utente. 2e 3 uguale o *aggiore di 1& sta* ate un *essaggio che dice che questo utente ha il er*esso di bere alcolici. 2e l:et! dell:utente 3 in)eriore a 1& sta* ate un *essaggio che dica all:utente quanti anni deve attendere ri*a che gli sia consentito legal*ente di bere. Co*e eAtra, calcolate quanta birra un utente *aggiore di 1" anni ha bevuto statistica*ente H1(( litri;annoI e sta* ate questa in)or*azione er l:utente. 2. 'ealizzate uno scri t che renda un )ile co*e argo*ento. 5tilizzate un docu*ento here che resenti all:utente una co ia di scelte er la co* ressione del )ile. 8e scelte otrebbero essere g1ip, b1ipP, compress e 1ip. 3. 'ealizzate uno scri t deno*inato salvataggiohome che auto*atizzi tar in *odo che la ersona che esegua lo scri t usi se* re le desiderate o zioni H cvpI e directorG di destinazione del salvataggio H/var/backupsI er )are una co ia d:e*ergenza della ro ria directorG ersonale HhomeI. I* le*entate le seguenti )unzionalit!7 Controllate il nu*ero di argo*enti. 8o scri t dovrebbe )unzionare senza argo*enti. 2e 3 resente un qualche argo*ento, uscite do o aver sta* ato un *essaggio di istruzioni. +eter*inate se la directorG backups ha abbastanza s azio libero er tenere la co ia d:e*ergenza.
127
Chiedete all:utente se desidera una co ia di salvataggio co* leta o incre*entale. 2e l:utente non ha ancora una co ia co* leta di salvataggio sta* ate un *essaggio che sar! realizzata una co ia co* leta d:e*ergenza. In caso di co ia di salvataggio incre*entale )ate solo questa se quella co* leta non 3 i@ vecchia di una setti*ana. Co* ri*ete la co ia di salvataggio utilizzando un qualsiasi stru*ento di co* ressione. In)or*ate l:utente che lo scri t sta )acendo questo, erch otrebbe richiedere un o: di te* o durante il quale l:utente otrebbe co*inciare a reoccu arsi se non a are nessuna e*issione sullo scher*o. 2ta* ate un *essaggio che in)or*i l:utente circa la di*ensione della co ia di salvataggio co* ressa. 4uardate info tar o Introduzione a 8inuA, ca itolo % [Pre arazione dei vostri dati[, er in)or*azioni di sotto)ondo #. 'ealizzate uno scri t deno*inato semplice-useradd.sh che aggiunga un utente locale al siste*a. 8o scri t dovrebbe7 1ccettare solo un unico argo*ento o istruzioni. ure uscire do o la sta* a di un *essaggio di
Controllare /etc/passwd e decidere sul ri*o I+ utente libero. 2ta* are un *essaggio contenente tale I+. creare un gru o rivato er questo utente veri)icando il )ile /etc/group. 2ta* are un *essaggio contenente l:I+ del gru o. Condividere le in)or*azioni con l:utente o eratore7 un co**ento che descriva questo utente, una scelta da un elenco di shell Hcontrollate l:accettabilit!, altri*enti uscite sta* ando un *essaggioI, data di scadenza di questo account, gru i eAtra a cui otrebbe a artenere il nuovo utente. Con le in)or*azioni ottenute, aggiungere una linea a ;etc; ass>d, ;etc;grou e ;etc;shado>7 creare la directorG ersonale dell:utente HhomeI Hcon i er*essi correttiVI7 aggiungere l:utente ai gru i secondari desiderati. I* ostare la ass>ord di questo utente co*e conosciuta stringa rede)inita. $. 'iscrivete lo scri t della 2ezione 7.2.1.# in *odo che esso legga l:i**issione dall:utente iuttosto che la renda dal ri*o argo*ento.
12"
,.1.2. ;se)pi
,.1.2.1. 6so della sostituzione dei co)andi per speci(icare voci di LI302
Il ri*o 3 un ese* io a linea di co*ando che *ostra l:uso di un ciclo for che esegue una co ia di Ca itolo %. Co* iti ri etitivi 12%
salvataggio di ogni )ile .xml. +o o aver dato il co*ando, iniziare a lavorare sui vostri sorgenti 3 sicuro7
[carol@octarine ~/articles] ls *.xml file1.xml file2.xml file3.xml [carol@octarine ~/articles] ls *.xml > lista [carol@octarine ~/articles] for i in `cat lista`; do cp "$i" "$i".bak ; done [carol@octarine ~/articles] ls *.xml* file1.xml file1.xml.bak file2.xml file2.xml.bak file3.xml file3.xml.bak
9uesto invece elenca i )ile in ;sbin che sono solo dei )ile di testo uro ed eventual*ente gli scri t7
for i in `ls /sbin`; do file /sbin/$i | grep ASCII; done
,.1.2.2. 6so del contenuto di una variabile per speci(icare voci di LI302
Il seguente 3 uno s eci)ico scri t a licativo er convertire )ile B/=8, secondo un certo sche*a, in )ile PBP. 8a conversione viene eseguita estraendo le ri*e 2$ linee e le ulti*e 21, sostituendo queste con due *arcatori HtagI PBP che )orniscono le linee di intestazione e di i3 agina7
[carol@octarine ~/html] cat html2php.sh #!/bin/bash # specifico script di conversione per i miei file da html a php LISTA="$(ls *.html)" for i in "$LISTA"; do NUOVONOME=$(ls "$i" | sed -e 's/html/php/') cat beginfile > "$NUOVONOME" cat "$i" | sed -e '1,25d' | tac | sed -e '1,21d'| tac >> "$NUOVONOME" cat endfile >> "$NUOVONOME" done
+al *o*ento che qui non )accia*o un conteggio delle linee, non c:3 *odo di conoscere il nu*ero di linea da cui iniziare a cancellare linee )ino a che si raggiunge il ter*ine. Il roble*a si risolve usando tac, che rovescia le linee in un )ile. Il comando basename Invece di usare sed er sostituire il su))isso ht*l con h , sarebbe i@ corretto utilizzare il co*ando basename. 8eggete le agine *an er *aggiori in)or*azioni. Strani caratteri .inirete nei guai se la lista si es ande ai no*i dei )ile contenenti s azi ed altri caratteri irregolari. 5n costrutto i@ ideale er ottenere la lista sarebbe quello di utilizzare la )unzione di globbing della shell, co*e questa7
for i in $PATHNAME/*; do comandi done
13(
,.2.2. ;se)pi
,.2.2.1. 3e)plice ese)pio di utilizzo di Bhile
9ui c:3 un ese* io er gli i* azienti7
#!/bin/bash # Questo script apre 4 finestre di terminale. i="0" while [ $i -lt 4 ] do xterm & i=$[$i+1] done
131
PICSDIR=/home/carol/pics WEBDIR=/var/www/carol/webcam while true; do DATA=`date +%Y%m%d` ORA=`date +%H` mkdir $WEBDIR/"$DATA" while [ $ORA -ne "00" ]; do DESTDIR=$WEBDIR/"$DATA"/"$ORA" mkdir "$DESTDIR" mv $PICSDIR/*.jpg "$DESTDIR"/ sleep 3600 ORA=`date +%H` done done
,sservate l:uso dell:istruzione true. 2igni)ica questo7 continua l:esecuzione )inch non venia*o interrotti con la )orza Hcon !ill o )trl*)I. 9uesto iccolo scri t uE essere utilizzato er e))ettuare una si*ulazione7 esso genera )ile.
#!/bin/bash # Questo genera un file ogni 5 minuti while true; do touch pic-`date +%s`.jpg sleep 300 done
,sservate l:uso del co*ando date er generare tutti i ti i di no*i di )ile e directorG. 4uardate le agine *an er *aggiori in)or*azioni. Ksate il sistema 8:ese* io recedente 3 a sco o di*ostrativo. 0eri)iche regolari si ossono ottenere con il rogra**a di utilit! cron. Non scordate di redirigere l:e*issione e gli errori quando utilizzate scri t che vengono eseguiti dal vostro crontabV
132
letteratura droghe educazione materie echo echo -n "Effettua la tua scelta: " read materia echo echo "Consiglio gratuito in materia di $materia: " echo $FORTUNE $materia echo done
0iene usato un docu*ento here er resentare all:utente le scelte ossibili. 6 di nuovo il test true ri ete i co*andi della lista )GQ7?@I')G?S%GK%?TI ancora e ancora.
,sservate co*e le variabili nelle ulti*e linee sono lasciate senza a ici er oter e))ettuare i calcoli arit*etici.
133
,.3.2. ;se)pio
5no scri t riordinaimmagini.sh *igliorato Hv. 2ezione %.2.2.2I, che veri)ichi la dis onibilit! di s azio su disco. 2e non 3 dis onibile abbastanza s azio su disco, ri*uovete le i**agini dai *esi recedenti7
#!/bin/bash # Questo script copia file dalla mia directory home in quella del webserver. # Una nuova directory viene creata ogni ora. # Se le immagini occupano troppo spazio, le pi vecchie vengono rimosse. while true; do DISCOPIENO=$(df -h $WEBDIR | grep -v File | awk '{print $5 }' | cut -d "%" -f1 -) until [ $DISCOPIENO -ge "90" ]; do DATA=`date +%Y%m%d` ORA=`date +%H` mkdir $WEBDIR/"$DATA" while [ $ORA -ne "00" ]; do DESTDIR=$WEBDIR/"$DATA"/"$ORA" mkdir "$DESTDIR" mv $PICDIR/*.jpg "$DESTDIR"/ sleep 3600 ORA=`date +%H` done DISCOPIENO=$(df -h $WEBDIR | grep -v File | awk '{ print $5 }' | cut -d "%" -f1 -) done DARIMUOVERE=$(find $WEBDIR -type d -a -mtime +30) for i in $DARIMUOVERE; do rm -rf "$i"; done done
13#
,sservate l:inizializzazione delle variabili ORA e DISCOPIENO e l:uso delle o zioni con ls e date er ottenere un:elencazione corretta er DARIMUOVERE.
13$
13&
;; 10) $FORTUNE educazione ;; 0) echo "OK, arrivederci!" break ;; *) echo "Quella non una scelta valida: prova un numero da 0 a 10." ;; esac done
'icordatevi che brea! interro* e il ciclo, non lo scri t. CiE si uE di*ostrare aggiungendo un co*ando echo al ter*ine dello scri t. 9uesto echo verr! eseguito anche su i**issione che causi l:esecuzione di brea! Hquando l:utente batte [([I. Nei cicli annidati brea! er*ette di s eci)icare quale ciclo interro* ere. 4uardate le agine info er *aggiori notizie.
,.$.3. ;se)pi
Nell:ese* io seguente i no*i dei )ile vengono convertiti in lettere *inuscole. 2e non va )atta alcuna conversione, un co*ando continue riavvia l:esecuzione del ciclo. 9uesti co*andi non *angiano tro e risorse del siste*a e, *olto )acil*ente, roble*i si*ili ossono essere risolti usando sed e a-!. /uttavia 3 utile conoscere questo ti o di costruzione quando si eseguono dei co* iti esanti, che otrebbero anche non essere necessari quando si inseriscono dei test nei osti giusti di uno scri t, ris ar*iando risorse di siste*a.
[carol@octarine ~/test] cat inminuscolo.sh #!/bin/bash # Questo script converte tutti i nomi di file contenenti caratteri MAIUSCOLI in # nomi di file contenenti solo caratteri minuscoli LISTA="$(ls)" for nome in "$LISTA"; do if [[ "$nome" != *[[:upper:]]* ]]; then continue fi ORIG="$nome" NUOVO=`echo $nome | tr 'A-Z' 'a-z'`
137
9uesto scri t ha al*eno un di)etto7 sovrascrive i )ile esistenti. 8:o zione noclobber er -ash 3 utile solo quando avviene una redirezione. 8:o zione -b al co*ando m )ornisce *aggiore sicurezza, *a 3 sicura solo in caso di una sovrascrittura accidentale, co*e 3 di*ostrato in questo test7
[carol@octarine ~/test] rm * [carol@octarine ~/test] touch test Test TEST [carol@octarine ~/test] bash -x inminuscolo.sh ++ ls + LIST=test Test TEST + [[ test != *[[:upper:]]* ]] + continue + [[ Test != *[[:upper:]]* ]] + ORIG=Test ++ echo Test ++ tr A-Z a-z + NUOVO=test + mv -b Test test + echo 'Il nuovo nome di Test test' Il nuovo nome di Test test + [[ TEST != *[[:upper:]]* ]] + ORIG=TEST ++ echo TEST ++ tr A-Z a-z + NUOVO=test + mv -b TEST test + echo 'Il nuovo nome di TEST test' Il nuovo nome di TEST test [carol@octarine ~/test] ls -a ./ ../ test test~
solo una volta. Con la sta* a di tutte le voci, viene sta* ato l:invito PS3 e viene letta una sola linea dall:i**issione standard. 2e questa linea consiste in un nu*ero che corris onde ad una delle voci, il valore di PAROLA viene i* ostato con il no*e di quella voce. 2e la linea 3 vuota, le voci e l:invito PS3 vengono nuova*ente *ostrati. 2e viene letto un carattere %&- H6nd ,) .ileI, il ciclo si interro* e. +al *o*ento che la *aggioranza degli utenti non ha un indizio su quale chiave sia usata er la sequenza 6,., 3 i@ alla loro ortata avere un co*ando brea! co*e una delle voci. 9ualsiasi altro valore della linea letta i* oster! PAROLA a))inch sia una stringa nulla. 8a linea letta viene salvata nella variabile REPLY. I )GQ7?@I'F%L7TISI vengono eseguiti do o ciascuna selezione )ino a che non viene letto il nu*ero che ra resenta il brea!. 9uesto interro* e il ciclo.
,.%.1.2. ;se)pi
9uesto 3 un ese* io *olto se* lice, *a, co*e otete vedere, non 3 *olto alla ortata degli utenti7
[carol@octarine testdir] cat private.sh #!/bin/bash echo "Questo script pu rendere privato qualunque file di questa directory." echo "Inserisci il numero del file che desiderate proteggere:" select NOMEFILE in *; do echo "Hai scelto $NOMEFILE ($REPLY), ora accessibile solo a te." chmod go-rwx "$NOMEFILE" done [carol@octarine testdir] ./private.sh Questo script pu rendere privato qualunque file di questa directory. Inserisci il numero del file che desiderate proteggere: 1) archivio-20030129 2) bash 3) privato.sh #? 1 Hai scelto archivio-20030129 (1) #?
13%
;; *) echo "Hai scelto $NOMFILE ($REPLY)" chmod go-rwx "$NOMEFILE" ;; esac done rm "$ABBANDONO"
,.%.2. 3otto)enu
9ualunque istruzione all:interno di un costrutto select uE essere un altro ciclo select, abilitando sotto*enu dentro *enu. +i base la variabile P23 non viene *odi)icata quando si inserisce un ciclo select annidato. 2e volete un invito diverso nel sotto*enu, assicuratevi di i* ostarlo al *o*ento giusto.
,.'.2. ;se)pi
5n:istruzione shi)t si usa di solito quando il nu*ero di argo*enti er un co*ando non 3 noto a riori, er ese* io quando gli utenti ossono dare quanti argo*enti desiderino. In tali casi, gli argo*enti vengono nor*al*ente elaborati in un ciclo -hile con una condizione di veri)ica ari a HH\PII. 9uesta condizione 3 vera er tutto il te* o che il nu*ero degli argo*enti 3 *aggiore di zero. 8a variabile $1 e l:istruzione shift )anno elaborare ogni ele*ento. Il nu*ero degli argo*enti viene ridotto ogni volta che shift viene eseguito e )inal*ente diventa zero, al che il ciclo -hile ter*ina. 8:ese* io sottostante, pulizia.sh, usa istruzioni shift er elaborare ogni )ile nella lista generata Ca itolo %. Co* iti ri etitivi 1#(
da find7
#!/bin/bash # Questo script pu cancellare file usati per l'ultima volta oltre 365 giorni fa. USO="Uso: $0 dir1 dir2 dir3 ... dirN" if [ "$#" == "0" ]; then echo "$USO" exit 1 fi while (( "$#" )); do if [[ $(ls "$1") == "" ]]; then echo "Directory vuota, niente da fare." else find "$1" -type f -a -atime +365 -exec rm -i {} \; fi shift done
'e+ec s. +args Il co*ando find so rastante uE essere con il seguente7 find opzioni 0 +args "comandi<da<eseguire<sui<file<tro ati# Il co*ando +args costruisce ed esegue linee di co*andi dall:i**issione standard. 9uesto ha il vantaggio che la linea di co*ando viene rie* ita )ino a raggiungere il li*ite del siste*a. 2oltanto do o verr! chia*ato il co*ando da eseguire7 nell:ese* io so rastante questo dovrebbe essere rm. 2e ci sono i@ argo*enti, verr! utilizzata una nuova linea di co*ando, )ino a che questa sar! iena o )inch non ci saranno i@ argo*enti. 8a stessa cosa avviene usando le chia*ate find -exec nel co*ando da eseguire sui )ile trovati ogni volta che se ne trova uno. CosD )acendo, l:uso di +args velocizza arecchio i vostri scri t e le restazioni della vostra *acchina. Nel rossi*o ese* io abbia*o *odi)icato lo scri t della 2ezione ".2.#.# in *odo che accetti i@ acchetti da installare alla volta7
#!/bin/bash if [ $# -lt 1 ]; then echo "Uso: $0 pacchetto/i" exit 1 fi while (($#)); do yum install "$1" << CONFIRM y CONFIRM shift done
,.*. 3o))ario
In questo ca itolo abbia*o trattato di co*e ossano essere incor orati dei co*andi ri etitivi in Ca itolo %. Co* iti ri etitivi 1#1
costrutti di ciclo. 8a *aggior arte dei co*uni cicli vengono realizzati utilizzando le istruzioni for, -hile o until, o ure una co*binazione di questi co*andi. Il ciclo for esegue un co* ito er un deter*inato nu*ero di volte. 2e non sa ete quante volte un co*ando dovrebbe essere eseguito, utilizzate until o -hile er recisare quando il ciclo dovrebbe ter*inare. I cicli si ossono interro* ere o ri etere utilizzando le istruzioni brea! e continue. 2i uE utilizzare un )ile co*e i**issione er un ciclo usando l:o eratore di redirezione dell:i**issione7 i cicli ossono anche leggere l:e*issione di co*andi che viene data in asto al ciclo ricorrendo ad un incanala*ento. Il costrutto select si usa er sta* are *enu negli scri t interattivi. 8:esecuzione di cicli attraverso gli argo*enti della linea di co*ando in uno scri t uE essere osta in essere utilizzando l:istruzione shift.
,.,. ;sercizi
'icordate7 quando realizzate scri t, lavorate a assi e rovate ogni asso ri*a di incor orarlo nel vostro scri t. 1. Create uno scri t che )ar! una co ia HricorsivaI dei )ile in ;etc in *odo che un a**inistratore di siste*a rinci iante ossa *odi)icare )ile senza ti*ori. 2. 2crivete uno scri t che renda esatta*ente un argo*ento, un no*e di directorG. 2e il nu*ero degli argo*enti 3 *aggiore o *inore di uno, sta* ate un *essaggio sull:uso. 2e l:argo*ento non 3 una directorG, sta* ate un altro *essaggio. +ella directorG indicata sta* ate i ri*i cinque )ile i@ grandi e i cinque )ile che sono stati *odi)icati i@ di recente. 3. Potete s iegare erch 3 cosD i* ortante *ettere le variabili tra a ici do della 2ezione %.#.2? i nell:ese* io
#. 2crivete uno scri t si*ile a quello in 2ezione %.$.1 *a ensate ad un *odo er ter*inare do o che l:utente ha eseguito 3 cicli. $. Pensate ad una *igliore soluzione ris etto a mo e -b er lo scri t della 2ezione %.$.3 er revenire la sovrascrittura dei )ile esistenti. Per ese* io, veri)icate se un )ile esiste o *eno. Non )ate lavori inutiliV &. 'iscrivete lo scri t qualedemone.sh della 2ezione 7.$ Jesercizio n.$K in *odo che7 sta* i un elenco dei server da controllare, co*e 1 ache, il server 22B, il de*one N/P, un de*one dei no*i, un de*one della gestione dell:ali*entazione e cosD viaN er ogni scelta l:utente ossa )are, sta* i alcune in)or*azioni sensibili, co*e il no*e del >eb server, le in)or*azioni N/P del traccia*ento e cosD viaN redis oniate la )acolt! er gli utenti di controllare altri server oltre quello 1#2
elencato, Per tali casi controllate che al*eno il rocesso indicato stia )unzionandoN rivediate lo scri t della 2ezione %.2.2.#. Notate co*e l:i**issione dei caratteri diversi da ( venga elaborata. 'icostruite questo scri t in *odo che sta* i un *essaggio se vengono )orniti dei caratteri co*e i**issione.
1#3
6sistono casi in cui desiderate evitare questo genere di co* orta*ento, er ese* io quando si gestiscono nu*eri tele)onici e di altro ti o. 1 arte gli interi e le variabili, otete anche s eci)icare una variabile che sia una costante. CiE viene )atto s esso all:inizio di uno scri t, quando viene dichiarato il valore della costante. +o o di ciE, esistono solo ri)eri*enti al no*e di variabile della costante, cosicch, quando 3 necessario *odi)icare la costante, ciE dovr! essere )atto una sola volta. 5na variabile uE essere anche una serie di variabili di qualsiasi ti o, una cosiddetta matrice Ho arra!I di variabili HVAR0, VAR1, VAR2, i VARNI.
8e seguenti o zioni sono utilizzate er deter*inare il ti o di dati che uE contenere la variabile e er assegnarle attributi7 Tabella 1B#1 &pzioni dell"integrato declare Gp1ione Significato -a -f -i -p 8a variabile 3 una *atrice Harra!I. 2olo utilizzo di no*i di )unzione. 8a variabile viene trattata co*e un intero7 la valutazione arit*etica si esegue quando viene assegnato un valore alla variabile Hv. 2ezione 3.#.&I. =ostra gli attributi e valori di ogni variabile. 9uando si usa < le o zioni aggiuntive vengono ignorate. 'ende a sola lettura le variabili. 1 queste variabili do o non ossono essere attribuiti valori con susseguenti istruzioni di assegna*ento, ed esse ne ure ossono essere eli*inate. +! ad ogni variabile l:attributo trace. =arca ciascuna variabile er l:es ortazione verso co*andi successivi tra*ite l:a*biente.
-r -t -x
8:uso di ] al osto di O disabilita invece l:attributo. 9uando si utilizza in una )unzione, declare crea variabili locali. 8:ese* io seguente *ostra co*e l:assegna*ento di un ti o ad una variabile in)luenzi il valore.
[bob in ~] declare -i VARIABILE=12 [bob in ~] VARIABILE=stringa [bob in ~] echo $VARIABILE 0 [bob in ~] declare -p VARIABILE declare -i VARIABILE="0"
Notate che -ash ha un:o zione er dichiarare un valore nu*erico, *a nessuna er dichiarare valori stringa. 9uesto 3 erch, di base, se nulla 3 stato s eci)icato, una variabile uE contenere qualunque ti o di dati7
[bob in ~] ALTRAVAR=blah [bob in ~] declare -p ALTRAVAR declare ALTRAVAR="blah"
Non a ena restringete l:assegna*ento di valori ad una variabile, essa uE contenere solo quel ti o di dati. 'estrizioni ossibili sono intero, costante o *atrice. 4uardate le agine in)o di -ash er in)or*azioni sullo stato di ritorno.
1-.1.3. Costanti
In -ash le costanti si creano rendendo a sola lettura una variabile. 8:integrato readonl. *arca ogni Ca itolo 1(. +i i@ sulle variabili 1#$
s eci)icata variabile co*e i**odi)icabile. 8a sintassi 37 readonl. OPZIONE VARIABILI I valori di queste variabili do o non si ossono i@ ca*biare con un successivo assegna*ento. 2e 3 stata data l:o zione -f, ogni variabile si ri)erisce ad una )unzione di shell7 v. Ca itolo 11. 2e 3 stata s eci)icata -a, tutte le variabili si ri)eriscono ad una *atrice di variabili. 2e non 3 stato dato nessun argo*ento, o 3 stata )ornita -p, viene *ostrato un elenco di tutte le variabili a sola lettura. 5sando l:o zione -p, l:e*issione uE essere rei* iegata co*e i**issione. 8o stato di ritorno 3 zero, a *eno che sia stata s eci)icata un:o zione non valida, una delle variabili o )unzioni non esista, o ure sia stata )ornita -f er un no*e di variabile al osto di un no*e di )unzione.
[bob in ~] readonly TUX=penguinpower [bob in ~] TUX=Mickeysoft bash: TUX: readonly variable
MATRICEN9 alore1 aloreP X alore?: ,gni valore 3 oi nella )or*a di @numeroindiceCD tringa. Il nu*ero d:indice 3 )acoltativo. 2e 3 )ornito, quell:indice 3 assegnato ad esso7 altri*enti l:indice dell:ele*ento assegnato 3 il nu*ero dell:ulti*o indice che 3 stato assegnato i@ uno. 9uesto )or*ato 3 accettato anche da declare. 2e non vengono )orniti nu*eri d:indice, l:indicizzazione inizia da zero. 8:aggiunta di *e*bri *ancanti o eAtra in una *atrice si )a usando la sintassi7 NOMEMATRICE[NUMEROINDICE]N alore 'icordate che l:integrato read *ette a dis osizione l:o zione -a, che consente la lettura e l:assegna*ento di valori alle variabili *e*bri di una *atrice.
.are ri)eri*ento al contenuto di una variabile *e*bro di una *atrice senza )ornire un nu*ero indice 3 lo stesso di )are ri)eri*ento al contenuto del ri*o ele*ento, quello re)erenziato con nu*ero di indice zero.
1#7
+o o lunghi giorni di ricerche, )inal*ente ho trovato questo ese* io o erando resso un )ornitore HproviderI Internet. 6sso distribuisce i )ile di con)igurazione del >eb server 1 ache negli host di una >eb )ar*7
#!/bin/bash if [ $(whoami) != 'root' ]; then echo "Bisogna essere root per avviare $0" exit 1; fi if [ -z $1 ]; then echo "Uso: $0 </path/to/httpd.conf>" exit 1 fi httpd_conf_new=$1 httpd_conf_path="/usr/local/apache/conf" login=htuser farm_hosts=(web03 web04 web05 web06 web07) for i in ${farm_hosts[@]}; do su $login -c "scp $httpd_conf_new ${i}:${httpd_conf_path}" su $login -c "ssh $i sudo /usr/local/apache/bin/apachectl graceful" done exit 0
I ri*i due controlli sono eseguiti er veri)icare se l:utente corretto sta avviando lo scri t con i giusti argo*enti. I no*i degli host che necessitano di essere con)igurati sono elencati nella *atrice farm_hosts. Poi tutti questi host vengono )orniti tra*ite il )ile di con)igurazione di 1 ache, do o di che si riavvia il de*one. Notate l:utilizzo dei co*andi della suite 2ecure 2hell nel cri tare le connessioni verso gli host re*oti. Ca itolo 1(. +i i@ sulle variabili 1#"
4razie, 6ugene e collega, er questo contributo. +an 'ichter ha contribuito all:ese* io seguente. 9uesto 3 il roble*a con cui si 3 con)rontato7 [i Nella *ia societ! abbia*o de*o del nostro sito >eb e ogni setti*ana qualcuno deve testarle tutte. CosD ho un:attivit! di cron che rie* ie una *atrice con tutti i ossibili candidati, usa date +%W er trovare la setti*ana dell:anno ed esegue un:o erazione di *odulo er trovare l:indice corretto. 8a ersona )ortunata viene noti)icata tra*ite osta elettronica[. 6 questo 3 stato il suo *odo di risolverlo7
#!/bin/bash # This is get-tester-address.sh # # First, we test whether bash supports arrays. # (Support for arrays was only added recently.) # whotest[0]='test' || (echo 'Failure: arrays not supported in this version of bash.' && exit 2) # # Our list of candidates. (Feel free to add or # remove candidates.) # wholist=( 'Bob Smith <bob@example.com>' 'Jane L. Williams <jane@example.com>' 'Eric S. Raymond <esr@example.com>' 'Larry Wall <wall@example.com>' 'Linus Torvalds <linus@example.com>' ) # # Count the number of possible testers. # (Loop until we find an empty string.) # count=0 while [ "x${wholist[count]}" != "x" ] do count=$(( $count + 1 )) done # # Now we calculate whose turn it is. # week=`date '+%W'` # The week of the year (0..53). week=${week#0} # Remove possible leading zero. let "index = $week % $count" email=${wholist[index]} echo $email # week modulo count = the lucky person
# Get the lucky person's e-mail address. # Output the person's e-mail address.
/ale scri t viene oi usato in altri scri t, co*e questo che utilizza un docu*ento here7
email=`get-tester-address.sh` hostname=`hostname` # Trova a chi mandare una e-mail. # Nome di questa macchina.
# # Invia una e-mail alla persona giusta. # mail $email -s '[Demo Testing]' <<EOF The lucky tester this week is: $email Reminder: the list of demos is here: http://web.example.com:8080/DemoSites
1#%
1-.3.3. 0ras(or)azioni di variabili 1-.3.3.1. 3ostituzione AMVAR:-PAROLAO 2e VAR non 3 de)inita o 3 nulla, la sostituisce l:es ansione di PAROLA, altri*enti viene sostituita dal suo valore.
[bob in ~] echo ${TEST:-test} test [bob in ~] echo $TEST [bob in ~] export TEST=una_stringa [bob in ~] echo ${TEST:-test} una_stringa [bob in ~] echo ${TEST2:-$TEST} una_stringa
9uesta )or*a 3 usata s esso nei test condizionali, er ese* io in questo7 Ca itolo 1(. +i i@ sulle variabili 1$(
4uardate la 2ezione 7.1.2.3 er *aggiori in)or*azioni su questo ti o di rova delle condizioni. 2e il trattino H<I viene sostituito con il segno uguale HbI, il valore viene assegnato al ara*etro se non esiste7
[bob in ~] echo $TEST2 [bob in ~] echo ${TEST2:=$TEST} una_stringa [bob in ~] echo $TEST2 una_stringa
8a sintassi seguente controlla l:esistenza di una variabile. 2e non 3 stata i* ostata, si sta* a l:es ansione di PAROLA nell:e*issione standard H tandard outputI e le shell non interattive si chiudono. 5na di*ostrazione7
[bob in ~] cat vartest.sh #!/bin/bash # Questo script controlla se una variabile stata dichiarata. In caso contrario, # esce stampando un messaggio. echo ${TESTVAR:?"C' cos tanto che ancora volevo fare..."} echo "TESTVAR stata dichiarata, possiamo procedere." [bob in testdir] ./vartest.sh ./vartest.sh: line 6: TESTVAR: C' cos tanto che ancora volevo fare... [bob in testdir] export TESTVAR=presente [bob in testdir] ./vartest.sh presente TESTVAR stata dichiarata, possiamo procedere.
8:uso di [][ al osto del unto escla*ativo i* osta la variabile er l:es ansione di PAROLA7 se non esiste, non succede nulla.
1$1
AMS7F=PAROLAO e AMS7F==PAROLAO 9uesti costrutti sono usati er cancellare il *odello corris ondente all:es ansione di PAROLA in VAR. PAROLA si es ande er rodurre un *odello ro rio co*e nell:es ansione dei no*i di )ile. 2e il *odello coincide con l:inizio del valore es anso di VAR, quindi il risultato dell:es ansione 3 il valore di VAR con il *odello di co* arazione i@ breve H[ #[I o il *odello di co* arazione i@ lungo Hindicato con [##[I. 2e VAR 3 * o @, l:o erazione di ri*ozione di *odelli 3 invece a licata ad ogni osizionale e l:es ansione 3 l:elenco risultante. ara*etro
2e VAR 3 una variabile *atriciale indicata con [^[ o [_[, l:o erazione di ri*ozione di *odelli viene a licata invece ad ogni *e*bro della *atrice e l:es ansione 3 il risultante elenco. CiE 3 *ostrato negli ese* i sottostanti7
[bob in ~] echo ${ARRAY[*]} one two one three one four [bob in ~] echo ${ARRAY[*]#one} two three four [bob in ~] echo ${ARRAY[*]#t} one wo one hree one four [bob in ~] echo ${ARRAY[*]#t*} one wo one hree one four [bob in ~] echo ${ARRAY[*]##t*} one one one four
8:e))etto o osto si ottiene utilizzando [d[ e [dd[, co*e nell:ese* io sottostante. PAROLA dovrebbe corris ondere con una orzione all:interno di una stringa7
[bob in ~] echo $STRINGA questoeunnomemoltolungo [bob in ~] echo ${STRINGA%lungo} questoeunnomemolto
1$2
o ${VAR//MODELLO/STRINGA} 8a ri*a )or*a ri* iazza la ri*a corris ondenza, la seconda ri* iazza tute le corris ondenze di MODELLO con STRINGA7
[bob in ~] echo ${STRINGA/nome/testo} questoeuntestomoltolungo
1-.#. 3o))ario
Nor*al*ente una variabile uE contenere qualunque ti o di dati, a *eno che siano dichiarate es licita*ente. 8e variabili costanti si i* ostano usando il co*ando integrato readonl.. 5na *atrice contiene un insie*e di variabili. 2e viene dichiarato un ti o di dato, allora tutti gli ele*enti della *atrice saranno i* ostati er contenere solo questo ti o di dato. 8e )unzionalit! di -ash consentono la sostituzione e la tras)or*azione [al volo[ delle variabili. 8e o erazioni standard co* rendono il calcolo della lunghezza di una variabile, arit*etica con le variabili, sostituzione del contenuto delle variabili e di arte di esso.
1-.$. ;sercizi
9ui ci sono alcuni ro* ica i7 1. 'edigete uno scri t che )accia quanto segue7 =ostri il no*e dello scri t che 3 in esecuzione. =ostri il ri*o, terzo e deci*o argo*ento )ornito allo scri t. =ostri il nu*ero totale di argo*enti assati allo scri t. 2e ci sono i@ di tre ara*etri osizionali, usate shift er *uovere tutti i valori di 3 osizioni verso sinistra. 2ta* i tutti i valori degli argo*enti restanti. 2ta* i il nu*ero di argo*enti. Controllate con zero, uno, tre e i@ di dieci argo*enti. 2. 'edigete uno scri t che i* le*enti un se* lice navigatore >eb Hin *odalit! testualeI, usando -get e lin!s -dump er *ostrare le agine B/=8 all:utente. 9uest:ulti*o ha tre scelte7 inserire un 5'8, inserire i er indietro e t er ter*inare. 4li ulti*i 1( 5'8 inseriti Ca itolo 1(. +i i@ sulle variabili 1$3
dall:utente sono conservati in una *atrice, da cui il *edesi*o utilizzando la )unzionalit! indietro.
uE ri ristinare l:5'8
1$#
11.1. Introduzione
11.1.1. Cosa sono le (unzioni?
8e )unzioni di shell sono un *odo di raggru are co*andi er l:esecuzione successiva , utilizzando un solo no*e er questo gru o o routine. Il no*e della routine deve essere univoco all:interno della shell o dello scri t. /utti i co*andi che costituiscono una )unzione vengono eseguiti co*e dei nor*ali co*andi. 9uando si chia*a una )unzione co*e un se* lice no*e di co*ando, l:elenco dei co*andi associati con quella )unzione viene eseguito. 5na )unzione si esegue all:interno della shell in cui 3 stata dichiarata7 non si crea nessun nuovo rocesso er inter retare i co*andi. +egli s eciali co*andi integrati si trovano ri*a delle )unzioni di shell durante la ricerca dei co*andi. 4li integrati s eciali sono7 brea!, ,, ., continue, e al, e+ec, e+it, e+port, readonl., return, set, shift, trap e unset.
eseguiti ogni qualvolta si s eci)ica FK?YIG?% co*e il no*e di un co*ando. 8o stato d:uscita 3 quello dell:ulti*o co*ando eseguito nel cor o. %rrori comuni 8e arentesi gra))e devono essere se arate dal cor o con s azi, altri*enti vengono inter retate nel *odo sbagliato. Il cor o di una )unzione dovrebbe ter*inare con un unto e virgola o un nuovalinea.
1$&
Parametro posizionale 1 dello script parametro1. Parametro posizionale 1 nella funzione altro_param. Il codice di uscita di questa funzione 0. [lydia@cointreau ~/test]
Notate che il valore di ritorno o il codice d:uscita della )unzione sono s esso conservati in una variabile, cosicch questa uE essere interrogata in un unto successivo. 4li scri t init nel vostro siste*a usano s esso la tecnica di interrogare la variabile RETVAL in un test condizionale, ro rio co*e questo7
if [ $RETVAL -eq 0 ]; then <avvia il demone>
, co*e questo ese* io dallo scri t /etc/init.d/amd, in cui vengono utilizzate le )unzioni di otti*izzazione di -ash7
[ $RETVAL = 0 ] && touch /var/lock/subsys/amd
I co*andi do o 88 vengono eseguiti solo quando il test rova di essere vero7 questo 3 un *odo i@ breve er ra resentare una struttura if;then;fi. Il codice di ritorno della )unzione 3 s esso utilizzato co*e codice d:uscita dell:intero scri t. 0edrete una quantit! di initscri t ter*inanti in qualcosa di si*ile a e+it $RETVAL.
9uesto 3 il ti o di )unzione che viene ti ica*ente con)igurata nei )ile di con)igurazione delle risorse di shell dell:utente. 8e )unzioni sono i@ )lessibili ris etto agli alias e )orniscono un *odo se* lice e )acile er adattare l:a*biente dell:utente. 6cco qui una er gli utenti +,27
dir () { ls -F --color=auto -lF --color=always "$@" | less -r }
1$7
8a )unzione considera il suo ri*o argo*ento co*e un no*e di ercorso. 2e questo no*e di ercorso non 3 ancora nel ercorso corrente, viene aggiunto. Il secondo argo*ento alla )unzione de)inisce se il ercorso sar! aggiunto davanti o dietro la de)inizione del PATH J ercorsoK corrente. 4li utenti nor*ali ottengono solo l:aggiunta di /usr/X11R6/bin ai loro ercorsi, *entre root ottiene una co ia di directorG eAtra contenenti co*andi di siste*a. +o o essere stata usata, la )unzione subisce unset cosicch non viene conservata.
1$"
1$%
9uesto scri t viene avviato da cron Hsigni)ica senza interazione u*anaI, cosicch redirigia*o l:errore standard H tandard errorI dal co*ando scp verso /dev/null. 2i otrebbe dedurre che tutte le )asi se arate otrebbero essere co*binate in un co*ando co*e tar c dir_da_salvare/ 0 b1ipP 0 ssh server Lcat I backup.tar.bz2L /uttavia , se siete interessati ai risultati inter*edi che otrebbero essere ri ristinati in caso di )alli*ento dello scri t, questo non 3 ciE che volete. 8:es ressione comando 8I file equivale a comando I file PI81
11.3. 3o))ario
8e )unzioni )orniscono un *odo )acile er raggru are co*andi che vi serve eseguire ri etitiva*ente. 9uando una )unzione sta )unzionando, i ara*etri osizionali vengono *odi)icati in quelli della )unzione. 9uando si )er*a, essi vengono ri ortati a quelli del rogra**a chia*ante. 8e )unzioni sono dei *iniscri t e, ro rio co*e gli scri t, generano dei codici d:uscita o di ritorno. 2ebbene questo sia stato un ca itolo breve, esso contiene nozioni i* ortanti che servono a raggiungere lo stato su re*o di igrizia che 3 l:obiettivo ti ico di qualsiasi a**inistratore di siste*a.
11.#. ;sercizi
9ui ci sono alcune cose utili che otete )are usando le )unzioni7 1. 1ggiungete una )unzione al vostro )ile di con)igurazione ~/.bashrc che auto*atizzi la sta* a delle agine *an. Il risultato dovrebbe essere che digitate qualcosa co*e printman HcomandoI, in *odo che la ri*a a ro riata agina *an esca dalla vostra sta* ante. .ate le veri)iche usando una seudo eri)erica di sta* a er rovare le )unzionalit!. Co*e eAtra, inserite la ossibilit! er l:utente di )ornire il nu*ero di sezione delle agina *an che vuole sta* are. 2. Create una sottodirectorG nella vostra directorG Ca itolo 11. .unzioni ersonale in cui otrete conservare le 1&(
de)inizioni delle )unzioni. =ettete una co ia di )unzioni in quella directorG. Potrebbero essere utili )unzioni, tra le altre, che voi abbiate gli stessi co*andi in un +,2 o in uno 5NIF co**erciale quando state lavorando con 8inuA, o viceversa. 9ueste )unzioni dovrebbero oi essere i* ortate nel vostro a*biente di shell quando viene letto ~/.bashrc.
1&1
12.1. 3egnali
12.1.1. Introduzione
12.1.1.1. 0rovare la pagina )an dei segnali
Il vostro siste*a contiene una agina *an che elenca tutti i segnali dis onibili, *a, in base al vostro siste*a o erativo, otrebbe essere a ribile in *odo di))erente. In *olti siste*i 8inuA, ciE otrebbe essere man Z signal. In caso di dubbio, localizzate le esatte agina *an e sezione utilizzando co*andi co*e man -k signal 0 grep list o apropos signal 0 grep list I no*i dei segnali si ossono trovare utilizzando !ill 'l.
)trl*[
)trl*Y
Imposta1ione del terminale Controllate le vostre i* ostazioni stt.. 8a sos ensione ed il ri ristino delle e*issioni sono di solito disabilitate se state usando [*oderne[ e*ulazioni di ter*inale. 8o standard +term su orta in *odo rede)inito )trl*S e )trl*Q.
SIGVILL e SIGSTG6 2I4SI88 e 2I42/,P non ossono essere intercettati, bloccati o ignorati. 9uando si uccide un rocesso o una serie di rocessi, 3 senso co*une iniziare a rovare con il segnale *eno ericoloso, 4)'T%9;. In questo *odo i rogra**i che si reoccu ano dello s egni*ento in *aniera ordinata ottengono la ossibilit! di seguire le rocedure er le quali essi sono stati rogettati ad eseguire quando ricevono il segnale 4)'T%9;, co*e la ulitura e la chiusura di )ile a erti. 2e inviate un segnale 4)'F)LL ad un rocesso, sottraete qualsiasi ossibilit! al rocesso di eseguire una ulitura e chiusura ordinate, cosa che otrebbe avere s iacevoli conseguenze. =a se non )unziona una chiusura ulita, i segnali )6T o F)LL otrebbero essere la sola *aniera. Per ese* io, quando un rocesso non *uore usando )trl*), 3 *eglio usare !ill '\ su quell:I+ di rocesso7
maud: ~> ps -ef | grep stuck_process maud 5607 2214 0 20:05 pts/5 maud: ~> kill -9 5607 maud: ~> ps -ef | grep stuck_process maud 5614 2214 0 20:15 pts/5 [1]+ Killed stuck_process 00:00:02 stuck_process
9uando un rocesso avvia diverse istanze, !illall otrebbe essere i@ conveniente7 accetta le stesse o zioni di !ill, *a le a lica a tutte le istanze di un dato rocesso. Provate questo co*ando ri*a di ado erarlo in un a*bito roduttivo, dal *o*ento che otrebbe non )unzionare co*e ci si as etta in alcuni tra gli 5niA co**erciali.
12.2. 0rappole
12.2.1. In generale
Ci otrebbero essere delle situazioni in cui non volete che gli utenti dei vostri scri t escano ri*a del te* o usando le sequenze di abbandono er *ezzo di tastiera, er ese* io erch si deve )ornire un:i**issione o ure deve essere eseguita una ri ulitura. 8:istruzione trap cattura queste sequenze e uE essere rogra**ata er eseguire un elenco di co*andi in base alla cattura di quei segnali. 8a sintassi er l:istruzione trap 3 chiara7 trap ")GQ7?@I# "S%G?7LI#
1&#
CiE istruisce il co*ando trap a catturare i 4%'6:L) elencati, che otrebbero essere i no*i di segnali con o senza il re)isso 4)', o ure i nu*eri dei segnali. 2e un segnale 3 B o %G)T, i )GQ7?@I vengono eseguiti quando la shell esce. 2e uno dei segnali 3 D%3(', la lista dei )GQ7?@I 3 eseguita do o ogni singolo co*ando. 5n segnale otrebbe essere anche s eci)icato co*e %997 in tal caso i )GQ7?@I vengono eseguiti ogni qualvolta un co*ando singolo esce con stato diverso da zero. Notate che questi co*andi non saranno eseguiti quando lo stato di uscita diverso da zero roviene da una arte di un:istruzione if, o da un ciclo -hile o until. Non verranno ne ure eseguiti se un :6D logico HffI o un &9 HXXI danno co*e risultato un codice d:uscita diverso da zero, o quando lo stato di ritorno di un co*ando viene invertito usando l:o eratore 0. 8o stato di ritorno del co*ando trap stesso 3 zero a *eno che non venga incontrata una s eci)icazione di segnale non valida. Il co*ando trap accetta una co ia di o zioni, che sono docu*entate nelle agine in)o di -ash. 9ui c:3 un ese* io *olto se* lice, che cattura )trl*) roveniente dall:utente sta* ando un *essaggio. 9uando rovate ad uccidere questo rogra**a senza s eci)icare il segnale F)LL, non accadr! nulla7
#!/bin/bash # traptest.sh trap "echo Buu!..." SIGINT SIGTERM echo "pid is $$" while : do sleep 60 done # Questo la stessa cosa di "while true". # Questo script in realt non sta facendo nulla.
vostro scri t7
declare -t VARIABILE=valore trap "echo VARIABILE in uso qui." DEBUG # resto dello script
12.3. 3o))ario
2i ossono inviare dei segnali ai vostri rogra**i usando il co*ando !ill o delle scorciatoie da tastiera. 9uesti segnali ossono essere intercettati, a seconda dell:azione che uE essere eseguita, utilizzando l:istruzione trap. 1lcuni rogra**i ignorano i segnali. 8:unico segnale che nessun rogra**a uE ignorare 3 il segnale F)LL/
12.#. ;sercizi
5na co ia di ese* i ratici7
1. 'ealizzate uno scri t che scriva una i**agine di avvio Hboot imageI in un dischetto utilizzando il rogra**a di utilit! dd. 2e l:utente rova ad interro* ere lo scri t usando )trl*), *ostrate un *essaggio che dica che tale azione render! inutilizzabile il dischetto. 2. 'edigete uno scri t che auto*atizzi l:installazione di un acchetto di terze arti di vostra scelta. Il acchetto deve essere scaricato da Internet, deco* resso, estratto dall:archivio e co* ilato se queste azioni sono co* atibili. 2oltanto la reale installazione del acchetto non dovrebbe essere interro* ibile. Ca itolo 12. Cattura dei segnali 1&&
1&7
1&"
)omando cd continue echo eval eAec )g Wobs ?ill ne>gr shi)t sto sus end ti*e u*as? unset >ait
Significato Ca*bia directorG Prosegue un ciclo del rogra**a =ostra le e*issioni Calcola degli argo*enti 6segue una nuova shell 6secuzione in ri*o iano =ostra i lavori HjobI attivi /er*ina i lavori in corso /ras)erisce ad un nuovo gru 2litta i ara*etri osizionali 2os ende un rogra**a dietro le quinte 2os ende un rogra**a in ri*o iano /e* orizza un co*ando I* osta o elenca i er*essi dei )ile Cancella de)inizioni di variabili o )unzioni 1s etta il ter*ine di un lavoro dietro le quinte o
1&%
sh
bash MO
!sh
Significato;71ione 6s ansione ele*enti in elenco 2ostituzione e*issione del comando incluso +irectorG ersonale HhomeI 2i*bolo directorG ersonale Catasta H tackI della directorG di accesso I* ostazione variabile d:a*biente Possono essere re)erenziati i@ di % argo*enti /utti gli argo*enti co*e arole se arate
EcomandoE $HOME
EcomandoE o A9comando: A9comando: $HOME Z Z], Z<, dirs $HOME Z Z], Z< varN alore e+port varN al ${nn} "$@" $# $?
"$@" $# $?
"$@" $# $?
$#argv $status
Nu*ero di argo*enti 2tato d:uscita del co*ando eseguito i@ di recente PI+ del rocesso *esso dietro le quinte i@ di recente , zioni correnti
$! $. file
$! $. file alias +N. case done esac e+it n for;do source file alias + . s-itch o case end endse+it (espr) foreach noglob alias -t alias -t cmds hashstat rehash unhash
8ettura di co*andi in )ile Il no*e + sta er il co*ando . 2celta tra alternative /er*ine di istruzione di ciclo /er*ine di case o s-itch 5scita con stato Ciclo er *ezzo di variabili Ignora i caratteri di sostituzione nella generazione dei no*i =ostra i co*andi con cancelletto Halias tracciatiI 'icorda la osizione dei co*andi +i*entica la osizione dei co*andi
case done esac e+it n for;do set -f/ set -o nullglob|dotglob| nocaseglob|noglob
17(
sh
Significato;71ione 6lenca i co*andi recedenti 'i etizione ulti*o co*ando 'i etizione ulti*o co*ando che inizia er [str[ 2ostituzione di [A[ con [G[ nel co*ando i@ recente che inizi er [c*d[, quando eseguito. /est condizioni d:ese* io .ine istruzione if I* osta i li*iti delle risorse 2ta* a la directorG in )unzione 8egge da ter*inale Ignora le interruzioni 'i*uove gli alias Inizia un ciclo until Inizia un ciclo -hile
r x=y cmd
!cmd:s/x/y/
8a -ourne 1gain 2hell ossiede *olte altre caratteristiche qui non elencate. 9uesta tabella 3 solo er darvi un:idea di co*e tale shell incor ori le idee utili rovenienti da altre shell7 qui non ci sono s azi vuoti nella colonna di bash. =aggiori in)or*azioni sulle caratteristiche riscontrabili solo in -ash si ossono rinvenire nelle agine in)o di -ash, nella sezione [-ash )eatures[. 5lteriori in)or*azioni7 +ovreste leggere al*eno un unico *anuale, trattandosi del *anuale della vostra shell. 8a scelta re)erita sarebbe info bash, essendo bash la shell 4N5 e quella i@ se* lice er i rinci ianti. 2ta* atevelo e ortatevelo a casa, studiatevelo ogni volta che avete $ *inuti.
171
5lossario
9uesta sezione contiene una anora*ica in ordine al)abetico dei co*andi 5NIF co*uni. =aggiori in)or*azioni sull:uso si ossono trovare nelle agine *an o in)o.
2
aPps .or*atta i )ile er la sta* a in una sta* ante Post2cri t. acroread 0isualizzatore P+.. adduser Crea un nuovo utente o aggiorna le in)or*azioni rede)inite del nuovo utente. alias Crea un alias di shell er un co*ando. anacron 6segue co*andi eriodica*ente, non resu apropos Cerca stringhe nella base dati >hatis. apt'get Progra**a di utilit! er la gestione dei acchetti. aspell Controllo ortogra)ico. at, at(, atrm 1ccoda*ento, esa*e o cancellazione di lavori dell:ulti*a esecuzione. 4lossario 172 one una *acchina se* re in )unzione.
B
bash -ourne 1gain 2hell. batch 1ccoda*ento, esa*e o cancellazione di lavori dell:ulti*a esecuzione. bg .a girare un lavoro dietro le quinte. bitmap 6ditor di bit*a e utilit! di conversione er il 2iste*a F >indo>. b1ipP 5n co* ressore di )ile a ordina*ento di blocchi.
C
cat Concatena )ile e sta* a sull:e*issione standard J tdoutK. cd Ca*bia +irectorG. cdp;cdpla. 5n rogra**a interattivo in *odalit! testuale er controllare e ri rodurre C+ 'o* audio sotto 8inuA. 4lossario 173
cdparanoia 5n:utilit! er la lettura di C+ audio che co* rende caratteristiche eAtra er la veri)ica dei dati. cdrecord 'egistra un C+<'. chattr =odi)ica gli attributi dei )ile. chgrp Ca*bia il gru ch!config 1ggiorna o richiede le in)or*azioni di livello di esecuzione dei servizi di siste*a. chmod =odi)ica i er*essi di accesso ai )ile. cho-n Ca*bia il ro rietario e il gru compress Co* ri*e )ile. cp Co ia )ile e directorG. crontab 4estisce i )ile crontab. csh 1 re una shell C. o di un )ile. o ro rietario.
4lossario
17#
+
date 2ta* a o i* osta la data e l:ora di siste*a. dd converte e co ia un )ile Hdis? du* I. df 'i)erisce l:uso dei dischi del )ile sGste*. dhcpd +e*one del cliente +BCP. diff /rova le di))erenze tra due )ile. dmesg 2ta* a o controlla il bu))er ad anello del ?ernel. du 0aluta l:uso dello s azio dei )ile.
;
echo =ostra una linea di testo. ediff Il diff del traduttere inglese
4lossario
17$
egrep grep esteso. e^ect 2*onta ed es elle su emacs 1vvio dell:editor 6*acs e+ec Invoca sotto rocessi. e+it 5scita dalla shell corrente. e+port 1ggiunge )unzioni all:a*biente della shell. orti re*ovibili.
/
fa+Pps Converte un )acsi*ile /I.. in Post2cri t fdformat .or*atta )lo fdis! 4estore delle tabelle delle artizioni sotto 8inuA. fetchmail raccoglie la osta da server P,P, I=1P, 6/'N o ,+='<co* atibile. fg G dis?.
4lossario
17&
Porta un lavoro in ri*o iano. file 2tabilisce il ti o di )ile. find /rova )ile. formail H'iI.or*attatore di osta. fortune 2ta* a un casuale e, si s era, interessante adagio. ftp 2ervizi di tras)eri*ento )ile Hnon sicuri a *eno che non venga utilizzato un account anoni*oVI.
5
galeon Navigatore internet gra)ico. gdm 4no*e +is laG =anager. Hmin;aIgett. Controlla le unit! di console. gimp Progra**a di *ani olazione delle i**agini. grep 2ta* e linee che corris ondono ad un *odello. 4lossario 177
grub 8a shell di grub g 5n visualizzatore Post2cri t e P+.. g1ip Co* ri*e o es ande un )ile.
F
halt .er*a il siste*a. head 6*ette la ri*a arte dei )ile. help =ostra gli aiuti sui co*andi integrati della shell. host Progra**a di utilit! er vedere +N2. httpd 2erver 1 ache dell:BG er/eAt /rans)er Protocol.
I
id 2ta* a gli 5I+ e 4I+ attuali ed e))ettivi. ifconfig Con)igura l:inter)accia di rete o ne *ostra la con)igurazione.
4lossario
17"
info 8egge i docu*enti In)o. init Inizializzazione dei controlli dei rocessi. iostat =ostra le statistiche I;,. ip =ostra;*odi)ica lo stato delle inter)acce di rete. ipchains 1**inistrazione del )ire>all IP. iptables 1**inistrazione dei )iltri dei acchetti IP.
G
^ar 2tru*ento di archiviazione Yava. ^obs 6lenca le o erazioni dietro le quinte.
H
!dm +es?to *anager Hgestore scrivaniaI er S+6. !illHallI /er*ina i rocessi.
4lossario
17%
L
ldapmodif. =odi)ica un inseri*ento 8+1P. ldapsearch 2tru*ento di ricerca 8+1P. less more con delle caratteristiche. lilo -oot 8oader Hcaricatore dell:avvioI di 8inuA. lin!s Navigatore CCC in *odalit! testo. ln Crea collega*enti tra )ile. load!e.s Caricale tabelle di traduzione della tastiera. locate /rova )ile. logout Chiude la shell corrente. lp
4lossario
1"(
Invia richieste al servizio di sta* a 8P. lp( Progra**a er esa*inare la coda d:attesa della sta* a. lpr 2ta* a non in linea. lprm 'i*uove richieste di sta* a. ls 6lenca il contenuto delle directorG. l.n+ Navigatore CCC in *odalit! testo.
9
mail Invia e riceve osta. man 8egge le agine *an. mcop. Co ia )ile =2+,2 verso;da 5niA. mdir =ostra una directorG =2+,2. memusage =ostra l:utilizzo della *e*oria.
4lossario
1"1
memusagestat =ostra le statistiche dell:utilizzo della *e*oria. mesg Controlla l:accesso in scrittura al vostro ter*inale. mformat 1ggiunge un )ile sGste* =2+,2 ad un )lo m!bootdis! Crea un )lo m!dir Crea directorG. m!isofs Crea un )ilesGste* ibrido I2,%&&(. more .iltro er *ostrare del testo una scher*ata er volta. mount =onta un )ile sGste* o mo1illa Navigatore di rete. mt Controlla le o erazioni dell:unit! a nastro *agnetico. mtr 2tru*ento di diagnosi della rete. m 4lossario 1"2 ure *ostra in)or*azioni sui )ile sGste* *ontati. G di avvio autosu))iciente ad avviare il siste*a. G dis? )or*attato a basso livello.
'ino*ina )ile.
named 2erver dei no*i di do*inio Internet. ncftp Progra**a di navigazione er servizi )t Hnon sicuroVI. netstat 2ta* a connessioni di rete, tabelle di instrada*ento, statistiche d:inter)accia, connessioni *ascherate e a artenenze a *ultitras*issioni. nfsstat 2ta* a statistiche sui )ile sGste* in rete. nice 1vvia un rogra**a con riorit! di esecuzione *odi)icata. nmap 2tru*ento di es lorazione della rete e scanditore di sicurezza. nts.s 2e* lice inter)accia er con)igurare i livelli di avvio.
P
pass-d Ca*bia ass>ord. pdfPps /raduttore 4hostscri t da P+. a Post2cri t. perl 4lossario 1"3
Practical 6Atraction and 'e ort 8anguage. pg I* agina l:e*issione di testo. ping invia una richiesta di eco ad un host. pr Converte )ile testuali er la sta* a. printen 2ta* a tutto o arte di un a*biente. procmail 6laboratore autono*o di osta. ps 'i orta lo stato dei rocessi. pstree =ostra un albero dei rocessi. p-d 2ta* a la corrente directorG di lavoro HPre ent 5ork Director!I.
<
(uota =ostra l:utilizzo del disco e i li*iti.
&
rcp
4lossario
1"#
Co ia re*ota Hnon sicuroVI. rdes!top Cliente del 'e*ote +es?to Protocol. reboot .er*a e riavvia il siste*a. renice 1ltera la riorit! di un rocesso in )unzione. rlogin 1utenticazione re*ota Htelnet, non sicuroVI. rm 'i*uove un )ile. rmdir 'i*uove una directorG. rpm 4estore di acchetti 'P=. rsh 2hell re*ota
3
scp Co ia re*ota sicura. screen 4estore dello scher*o con e*ulazione 0/1((.
4lossario
1"$
set =ostra, i* osta o *odi)ica una variabile. setterm I* osta gli attributi di un ter*inale. sftp 2ecure Hcri tatoI )t . sh 1 re una shell standard. shutdo-n 2 egne un siste*a. sleep 1ttende er un certo eriodo. slocate 0ersione avanzata di sicurezza del 4N5 locate. slrnn Cliente 5senet in *odalit! testo. snort 2tru*ento er la sco erta di intrusioni in rete. sort 'iordina linee di )ile di testo. ssh 2ecure 2Bell. ssh'!e.gen 4lossario 1"&
4enerazione di chiavi di autenticazione. stt. =odi)ica e sta* a i* ostazioni delle linee di ter*inale. su 2>itch 5ser Hca*bia utenteI.
0
tac Concatena e sta* a )ile al contrario. tail 6*ette l:ulti*a arte di )ile. tal! Parla ad un utente. tar 5tilit! di archiviazione. tcsh 1 re una /urbo C 2Bell. telnet Inter)accia utente al rotocollo /68N6/ Hnon sicuroVI. te+ .or*attazione e i* ostazione ti ogra)ica di testi. time /e* orizza un se* lice co*ando o d! l:uso delle risorse.
4lossario
1"7
tin Progra**a di lettura ne>s. top =ostra i rinci ali rocessi della CP5. touch a*bia le *arcature te* orali dei )ile. traceroute 2ta* a i acchetti di instrada*ento richiesti er collegare in rete un host. trip-ire 5n controllore di integrit! dei )ile er i siste*i 5niA. t-m /ab Cindo> =anager er il siste*a F Cindo>.
6
ulimit Controlla le risorse. umas! I* osta la *aschera della creazione dei )ile degli utenti. umount 2*onta un )ile sGste*. uncompress +eco* ri*e )ile co* ressi. uni(
4lossario
1""
'i*uove le linee du licate in un )ile ordinato. update +e*one del ?ernel er scaricare *e*orie di transito Hbu))erI s orche di ritorno al disco. uptime =ostra il te* o di )unziona*ento ed il carico *edio del siste*a. userdel Cancella l:account di un utente e i )ile relativi.
1
i HmI 1vvia l:editor vi Hi= rovedI. imtutor Il corso di 0i*. mstat 'i)erisce le statistiche della *e*oria virtuale.
I
=ostra chi 3 collegato e cosa sta )acendo. -all Invia un *essaggio sul ter*inale di ognuno. -c 2ta* a il nu*ero di bGte, arole e linee nei )ile. -hich
4lossario
1"%
=ostra il ercorso intero dei co*andi Hdi shellI. -ho =ostra chi 3 collegato. -hoami =ostra l:I+ dell:attuale utente. -hois 6))ettua una ricerca nella basedati >hois o dei no*i nic. -rite Invia un *essaggio ad un altro utente.
:
+auth F authoritG )ile utilitG. +cdroast Inter)accia gra)ica di cdroast. +cloc! ,rologio analogico;digitale er F. +console Controlla i *essaggi della console di siste*a tra*ite F. +dm 4estore dello scher*o F con su +d i 0isualizzatore +0I. orto er F+=CP, selettore di host.
4lossario
1%(
+fs 2erver F dei )ont. +host Progra**a er F di controllo degli accessi al server. +inetd Il de*one esteso dei servizi Internet. +load Presentazione er F della *edia di carico di siste*a. +lsfonts 0isualizzatore er F dell:elenco dei )ont del server. +mms 'i roduttore audio er F. +term 6*ulatore di ter*inale er F.
J
1cat Co* ri*e o es ande )ile. 1grep 'icerca eventuali )ile co* ressi in base ad una es ressione regloare. 1more .iltro er la visione di testo co* resso.
4lossario
1%1
Indice
2
alias 2ezione 3.$.1 alias Hrimo1ione degliI 2ezione 3.$.2 ancore delle parole 2ezione #.2.2.1 ancore di linea 2ezione #.2.2.1 7?SI') (uoting 2ezione 3.3.$ apici singoli 2ezione 3.3.3 argomenti 2ezione 7.2.1.2 espansione aritmetica 2ezione 3.#.7 apici doppi 2ezione 3.3.# arra. 2ezione 1(.2.1 a-! 2ezione &.1 a-!program 2ezione &.1.2
Bourne shell 2ezione 1.1.2 brace e+pansion 2ezione 3.#.3 built'in commands 2ezione 1.3.2
C
caratteri di irgolettatura 2ezione 3.3 case Histru1ioniI 2ezione 7.2.$ cerca e sostituisci 2ezione $.2.# chiamata 2ezione 1.2.2.1 chiamata da remoto 2ezione 1.2.2.2.& child process 2ezione 1.3.1 classi di caratteri 2ezione #.2.2.2, 2ezione #.3.2 comandi integrati 2ezione 1.3.2 combined e+pressions 2ezione 7.1.1.1 command substitution 2ezione 3.#.& commenti 2ezione 2.2.2 compara1ione dei modelli 2ezione #.3 conditionals 2ezione 7.1 condi1ionali 2ezione 7.1 configura1ione Hfile diI 2ezione 3.1 confronti numerici 2ezione 7.1.2.2 costanti 2ezione 1(.1.3 continue 2ezione %.$.2 controllo Hsegnali diI 2ezione 12.1.1.3 corre1ione degli script 2ezione 2.3 crea1ione di ariabili 2ezione 3.2.2 1%2
B
bash 2ezione 1.2 .bash<login 2ezione 3.1.2.2 .bash<logout 2ezione 3.1.2.$ .bash<profile 2ezione 3.1.2.1 .bashrc 2ezione 3.1.2.# batch editor 2ezione $.1.1 brea! 2ezione %.$.1 boolean operators 2ezione 7.2.# Indice
+
debugging scripts 2ezione 2.3 declare 2ezione 1(.1.2, 2ezione 1(.2.1 descrittori dei file 2ezione ".2.3, 2ezione ".2.#.1 di isione delle parole 2ezione 3.#.% double (uotes 2ezione 3.3.#
;
echo 2ezione 1.$.$, 2ezione 2.1.2, 2ezione 2.3.2, 2ezione ".1.2 editors 2ezione 2.1.1 else 2ezione 7.2.1 emacs 2ezione 2.1.1 emissione standard 2ezione ".2.3.1 en 2ezione 3.2.1.1 errore standard 2ezione ".2.3.1 esac 2ezione 7.2.$ escape HcaratteriI 2ezione 3.3.2 escape Hse(uen1eI 2ezione ".1.2 esecu1ione 2ezione 2.1.3 espansione dei nomi dei file 2ezione 3.#.% espansione dei parametri 2ezione 3.#.$ espansione delle parentesi 2ezione 3.#.3 espansione delle ariabili 2ezione 3.#.$ espressioni combinate 2ezione 7.1.1.1 Indice
espressioni primarie 2ezione 7.1.1.1 espressioni regolari 2ezione #.1 espressioni regolari estese 2ezione #.1.3 ;etc;bashrc 2ezione 3.1.1.2 ;etc;pass-d 2ezione 1.1.2 ;etc;profile 2ezione 3.1.1 ;etc;shells 2ezione 1.1.2 e+ec 2ezione 1.3.1, 2ezione ".2.#.2 e+ecute permissions 2ezione 2.1.3 e+ecution 2ezione 2.1.3 e+it 2ezione 7.2.$ e+it status 2ezione 7.1.2.1 espansione 2ezione 1.#.1.$, 2ezione 3.# e+port 2ezione 3.2.3 e+tended regular e+pressions 2ezione #.1.3
/
file descriptors 2ezione ".2.3, 2ezione ".2.#.1 file di ini1iali11a1ione 2ezione 3.1 file name e+pansion 2ezione 3.#.% find and replace 2ezione $.2.# flusso logico 2ezione 1.$.# for 2ezione %.1 for! 2ezione 1.3.1 fun1ioni 2ezione 11.1.1
1%3
5
ga-! 2ezione &.1.1 ga-! HcampiI 2ezione &.2.1 ga-! HcomandiI 2ezione &.1.2 ga-! Hformatta1ioneI 2ezione &.2.2 ga-! HscriptI 2ezione &.2.$ ga-! H ariabiliI 2ezione &.3 gedit 2ezione 2.1.1 global ariables 2ezione 3.2.1.1 globbing 2ezione 2.3.2 grep 2ezione #.2.1
G H
!ill 2ezione 12.1.2 !illall 2ezione 12.1.2 !sh Sorn shell, 2ezione 1.1.2
L
line anchors 2ezione #.2.2.1 locale 2ezione 3.3.& locate 2ezione 2.1.1 logic flo2ezione 1.$.# login shell 2ezione 1.2.2.2.1 lunghe11a di una ariabile 2ezione 1(.3.2
F
here HdocumentoI 2ezione ".2.#.#
I
if 2ezione 7.1.1 if annidati 9istru1ioni di: 2ezione 7.2.3 immissione da utente 2ezione ".2.1, 2ezione ".2.2 immissione standard 2ezione ".2.3.1 init 2ezione 1.3.1, 2ezione 1.$.& initiali1ation files 2ezione 3.1 input field separator 2ezione 3.2.#.1, 2ezione 3.2.$, 2ezione &.3 interacti e editing 2ezione $.2 interacti e scripts 2ezione ".1 interacti e shell 2ezione 1.2.2.2.1, 2ezione 1.2.2.2.2, Indice
9
matrice 2ezione 1(.2.1 menu 2ezione %.& messaggi da utente 2ezione ".1.1 metacaratteri 2ezione #.2.2.3 metacaratteri 9nelle espressioni regolari: 2ezione #.1.2 modifiche interatti e 2ezione $.2 modifiche non interatti e 2ezione $.3
1%#
nested if statements 2ezione 7.2.3 noglob 2ezione 2.3.2 non'interacti e editing 2ezione $.3 non'interacti e shell 2ezione 1.2.2.2.3 non'login shell 2ezione 1.2.2.2.2 numeric comparisons 2ezione 7.1.2.2
2ezione 3.2.1.1 printf 2ezione 1.$.$, 2ezione &.3.& process substitution 2ezione 3.#." processo figlio 2ezione 1.3.1 .profile 2ezione 3.1.2.3 prompt 2ezione 3.1.3
.
operatori aritmetici 2ezione 3.#.7 operatori booleani 2ezione 7.2.# operatori delle espressioni regolari 2ezione #.1.2, 2ezione $.2, 2ezione &.2.# op1ioni 2ezione 3.&.1 output field separator 2ezione &.3.2.1 output record separator 2ezione &.3.2.2
<
(uoting characters 2ezione 3.3
&
redire1ione 2ezione 1.#.1.7, 2ezione 3.&.2, 2ezione ".2.3, 2ezione %.# rbash 2ezione 1.2.2.1( read 2ezione ".2.1 readonl. 2ezione 1(.1.3 regular e+pression operators 2ezione #.1.2, 2ezione $.2, 2ezione &.2.# regular e+pressions 2ezione #.1 remote in ocation 2ezione 1.2.2.2.& remo ing aliases 2ezione 3.$.2 reser ed ariables 2ezione 3.2.# return 2ezione 11.1.3
P
parameter e+pansion 2ezione 3.#.$ parametri posi1ionali 2ezione 3.2.$, 2ezione 11.1.3 parametri speciali 2ezione 3.2.$ 67T_ 2ezione 2.1.2 pattern matching 2ezione #.3 permessi di esecu1ione 2ezione 2.1.3 positionalparams 2ezione 3.2.$, 2ezione 11.1.3 6GSIR 2ezione 1.2.1 6GSIR 9modalit]: 2ezione 1.2.2.2.$ primar. e+pressions 2ezione 7.1.1.1 printen Indice
3
script interatti i 2ezione ".1 sed 2ezione $.1 sed Hcomandi di modificaI 2ezione $.1.2 sed Hop1ioniI 2ezione $.1.2 1%$
sed HscriptI 2ezione $.3.2 segnali 2ezione 12.1.1 select 2ezione %.& separatore dei campi d&emissione 2ezione &.3.2.1 separatore dei campi d&immissione 2ezione 3.2.#.1, 2ezione 3.2.$, 2ezione &.3 separatore dei record in uscita 2ezione &.3.2.2 set 2ezione 3.2.1.2, 2ezione 3.&.1, 2ezione 11.1.# shell di autentica1ione 9o di login: 2ezione 1.2.2.2.1 shell interatti a 2ezione 1.2.2.2.1, 2ezione 1.2.2.2.2, 2ezione 1.2.2.3.3 shell non di autentica1ione 9o di login: 2ezione 1.2.2.2.2 shell non interatti a 2ezione 1.2.2.2.3 shift 2ezione %.7 single (uotes 2ezione 3.3.3 sintassi 2ezione 1.#.1.1 sorgente 2ezione 2.1.3 sostitu1ione 2ezione 1(.3.3.1, 2ezione 1(.3.3.3 sostitu1ione dei comandi 2ezione 3.#.& sostitu1ione dei processi 2ezione 3.#." sottostringa 2ezione 1(.3.3.2 source 2ezione 2.1.3 special parameters 2ezione 3.2.$ standard error 2ezione ".2.3.1 standard input 2ezione ".2.3.1 standard output Indice
2ezione ".2.3.1 stato d&uscita 2ezione 7.1.2.1 stringa 2ezione 7.1.2.3 stt. 2ezione 12.1.1 submenu 2ezione %.&.2 subshell 2ezione 2.2.1 substring 2ezione 1(.3.3.2
0
tcsh 2ezione 1.1.2 terminologia 2ezione 1.$.3 then 2ezione 7.1.1.2 tilde Hespansione dellaI 2ezione 3.#.# trasforma1ione di ariabili 2ezione 1(.3.3 trappole 2ezione 12.2.1 true 2ezione %.2.2.2
6
unalias 2ezione 3.$.1, 2ezione 3.$.2 unset 2ezione 3.2.2, 2ezione 1(.2.3, 2ezione 11.1.# until 2ezione %.3 user input 2ezione ".2.1, 2ezione ".2.2 user messages 2ezione ".1.1
1
ariabili 2ezione 3.2, 2ezione 1(.1 ariabili globali 2ezione 3.2.1.1 1%&
ariabili riser ate 2ezione 3.2.# ariabili speciali 2ezione 3.2.$ ariable e+pansion 2ezione 3.#.$ erbose 2ezione 2.3.2 i HmI 2ezione 2.1.1 irgolettatura 7?SI') 2ezione 3.3.$
I
-ait 2ezione 12.2.2 -hereis 2ezione 2.1.1 -hich 2ezione 2.1.1 -hile 2ezione %.2 -ildcards 2ezione #.2.2.3 -ord anchors 2ezione #.2.2.1 -ord splitting 2ezione 3.#.%
:
+trace 2ezione 2.3.1, 2ezione 2.3.2
K J
Indice
1%7