introduzione all'uso del computer
DESCRIPTION
Introduzione all'uso del computer. U. n. i. x. Gianluigi Boca [email protected]. Trasparenze disponibili su Web all'indirizzo http://www.pv.infn.it/~boca/lezioni/unix/index.htm. The Linux Users' Guide http://www.linuxhq.com/guides/LUG/guide.html. Referenze. Advanced Linux Programming - PowerPoint PPT PresentationTRANSCRIPT
1*
2*
3*
4*
5*
QQuesto capitolo tratta di sistemi di numerazione a base diversa da quella decimale allauesto capitolo tratta di sistemi di numerazione a base diversa da quella decimale alla
quale siamo abituati. Impareremoquale siamo abituati. Impareremo i i numeri binari numeri binari vale a dire quelli con base vale a dire quelli con base 22,, i i numerinumeriottaliottali, cioe’ quelli con base , cioe’ quelli con base 88,, ed i ed i numeri esadecimalinumeri esadecimali, cioe’ quelli con base , cioe’ quelli con base 1616..
Vedremo che questi sistemi di numerazione sono piu’ utili di quello decimale per descivereil contenuto di una qualunque cella di memoria o registro del computer. Questo poiche’questi ultimi sono sempre composti o da circuiti elettronici o da dispositivi magnetici o dadispositivi ottici che possono assumere solo 2 possibili stati (ON ed OFF; magnetizzazioneYES or NO; superficie riflettente o non riflettente etc.) Cosi’ il sistema binario, cioe’ quelloche usa solo 2 cifre per descrivere i numeri, diventa il modo piu’ naturale da usare con uncomputer, per contare i numeri. L’utilita’ della numerazione ottale ed esadecimalediscende in sostanza dal fatto che sono sistemi di numerazione piu’ sintetici (uno stessonumero in ottale od esadecimale e’ molto piu’ corto del corrispondente binario) che sipossono molto facilmente e direttamente trasformare nel corrispondente numero binario.
6*
La La basebase di un sistema di numerazione di un sistema di numerazione e’ il numero di simboli (cifre) usati e’ il numero di simboli (cifre) usati per descrivere i numeri. Il sistema per descrivere i numeri. Il sistema binario usa solo due cifre : binario usa solo due cifre : 0 0 ed ed ; ; quello ottale usa otto cifre : quello ottale usa otto cifre : 00, , , , 22,, 3 3, , 44, , 55, , 66, , 77 ; quello decimale, come e’ ; quello decimale, come e’ noto, ne usa dieci , dallonoto, ne usa dieci , dallo 0 0 al al 99 ; infine ; infine quello esadecimale ne usa sedici : quello esadecimale ne usa sedici : 00, , , , 22, , 33, , 44,, 5 5, , 66, , 77, , 88, , 99, , AA, , BB, , CC, , DD, , EE, , FF..In tutti i sistemi di numerazione, In tutti i sistemi di numerazione, analogamente al caso della analogamente al caso della numerazione decimale, si usa la numerazione decimale, si usa la notazionenotazione posizionaleposizionale
00 11 22 33 44 55 66 77 88 991010
Base Base 1010Base Base 1010
111111221133114411551166117711881199
ho finito le cifre, metto ho finito le cifre, metto 11 in una in una colonna piu’ a sinistra e nella colonna piu’ a sinistra e nella colonna piu’ a destra riparto dacolonna piu’ a destra riparto da 00
ho finito le cifre, metto ho finito le cifre, metto 11 in una in una colonna piu’ a sinistra e nella colonna piu’ a sinistra e nella colonna piu’ a destra riparto dacolonna piu’ a destra riparto da 00
10101010
ho finito le cifre, metto ho finito le cifre, metto 22 nella nella colonna piu’ a sinistra e nella colonna piu’ a sinistra e nella colonna piu’ a destra riparto dacolonna piu’ a destra riparto da 00
ho finito le cifre, metto ho finito le cifre, metto 22 nella nella colonna piu’ a sinistra e nella colonna piu’ a sinistra e nella colonna piu’ a destra riparto dacolonna piu’ a destra riparto da 00202020202020
Numeri decimali, Numeri decimali, notazione posizionale notazione posizionale ::xxxx
Numeri decimali, Numeri decimali, notazione posizionale notazione posizionale ::xxxx
7.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 16
7*
00 11 22 33 44 55 66 77 88 991010
Base Base 1010Base Base 1010
1111112211331144115511661177118811992020
7.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 16
Base Base 22Base Base 22
00 111010101010101111
100100100100100100 101101 110110 111111 10001000 10011001 10101010 10111011 11001100 11011101 11101110 1111111110000100001000110001100101001010011100111010010100
ho finito le cifre, metto ho finito le cifre, metto 11 in una colonna piu’ a sinistra e in una colonna piu’ a sinistra e nella colonna piu’ a destra riparto danella colonna piu’ a destra riparto da 00
ho finito le cifre, metto ho finito le cifre, metto 11 in una colonna piu’ a sinistra e in una colonna piu’ a sinistra e nella colonna piu’ a destra riparto danella colonna piu’ a destra riparto da 00
ho finito le cifre, metto ho finito le cifre, metto 11 in una colonna piu’ a sinistra e in una colonna piu’ a sinistra e nelle colonne piu’ a destra riparto danelle colonne piu’ a destra riparto da 00, etc., etc.
ho finito le cifre, metto ho finito le cifre, metto 11 in una colonna piu’ a sinistra e in una colonna piu’ a sinistra e nelle colonne piu’ a destra riparto danelle colonne piu’ a destra riparto da 00, etc., etc.
Numeri binariNumeri binari traduzione in numero decimale :traduzione in numero decimale :xxxxx
Numeri binariNumeri binari traduzione in numero decimale :traduzione in numero decimale :xxxxx
8*
00 11 22 33 44 55 66 77 88 991010
Base Base 1010Base Base 1010
1111112211331144115511661177118811992020
7.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 16
Base Base 22Base Base 22
00 1110101111
100100 101101 110110 111111 10001000 10011001 10101010 10111011 11001100 11011101 11101110 1111111110000100001000110001100101001010011100111010010100
Base Base 88Base Base 88
ho finito le cifre, metto ho finito le cifre, metto 11 in una colonna piu’ in una colonna piu’a sinistra e nella colonna piu’ a destra riparto a sinistra e nella colonna piu’ a destra riparto dada 00
ho finito le cifre, metto ho finito le cifre, metto 11 in una colonna piu’ in una colonna piu’a sinistra e nella colonna piu’ a destra riparto a sinistra e nella colonna piu’ a destra riparto dada 00
ho finito le cifre, metto ho finito le cifre, metto 11 in una colonna piu’ a in una colonna piu’ a sinistra e nelle colonne piu’ a destra riparto sinistra e nelle colonne piu’ a destra riparto dada 00, etc., etc.
ho finito le cifre, metto ho finito le cifre, metto 11 in una colonna piu’ a in una colonna piu’ a sinistra e nelle colonne piu’ a destra riparto sinistra e nelle colonne piu’ a destra riparto dada 00, etc., etc.
00 11 22 33 44 55 66 77
10101010101011111212131314141515161617172020202020202121222223232424
Numeri ottaliNumeri ottalitraduzione in numero decimale :traduzione in numero decimale :172.6(8) 1 x 82 + 7 x 81 + 2 x 80 + 6 x 81 = 122.75 (10)
Numeri ottaliNumeri ottalitraduzione in numero decimale :traduzione in numero decimale :172.6(8) 1 x 82 + 7 x 81 + 2 x 80 + 6 x 81 = 122.75 (10)
9*
00 11 22 33 44 55 66 77 88 991010
Base Base 1010Base Base 1010
1111112211331144115511661177118811992020
7.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 167.1 Numerazioni con basi 2, 8, 16
Base Base 22Base Base 22
00 1110101111
100100 101101 110110 111111 10001000 10011001 10101010 10111011 11001100 11011101 11101110 1111111110000100001000110001100101001010011100111010010100
Base Base 88Base Base 88 Base Base 1616Base Base 1616
ho finito le cifre, metto ho finito le cifre, metto 11 in in una colonna piu’ a sinistra e una colonna piu’ a sinistra e nelle colonne piu’ a destra nelle colonne piu’ a destra riparto dariparto da 00, etc., etc.
ho finito le cifre, metto ho finito le cifre, metto 11 in in una colonna piu’ a sinistra e una colonna piu’ a sinistra e nelle colonne piu’ a destra nelle colonne piu’ a destra riparto dariparto da 00, etc., etc.
Numeri esadecimaliNumeri esadecimali traduzione in numero decimale :traduzione in numero decimale :B2.6(16) x + x+2 x 160+6x
=
Numeri esadecimaliNumeri esadecimali traduzione in numero decimale :traduzione in numero decimale :B2.6(16) x + x+2 x 160+6x
=
00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1010101010101111121213131414
20202121222223232424
1111121213131414151516161717
00 11 22 33 44 55 66 77
1010
10*
7.2 Come passare da un numero decimale al7.2 Come passare da un numero decimale al corrispondente binario, ottale, esadecimalecorrispondente binario, ottale, esadecimale7.2 Come passare da un numero decimale al7.2 Come passare da un numero decimale al corrispondente binario, ottale, esadecimalecorrispondente binario, ottale, esadecimale
Direttamente con degli esempi, facciamo vedere coma passare da un numero decimale Direttamente con degli esempi, facciamo vedere coma passare da un numero decimale al corrispondente binario, ottale, esadecimale.al corrispondente binario, ottale, esadecimale.
Esempio : passare da 29.2 (decimale) al corrispettivo binarioEsempio : passare da 29.2 (decimale) al corrispettivo binarioEsempio : passare da 29.2 (decimale) al corrispettivo binarioEsempio : passare da 29.2 (decimale) al corrispettivo binario
Si considera prima la parte intera, eseguendo Si considera prima la parte intera, eseguendo divisionidivisioni successive successive per per 22 fino a quando il risultato fa fino a quando il risultato fa 00. Le cifre ottenute sono la parte . Le cifre ottenute sono la parte intera del numero binario corrispondente a quello decimale.intera del numero binario corrispondente a quello decimale.11
il risultato della divisione e’ 0, il procedimento e’finito
il risultato della divisione e’ 0, il procedimento e’finito
Il resto della divisione diventa una cifra binaria
Il resto della divisione diventa una cifra binaria
primo resto : ciframeno significativa
primo resto : ciframeno significativa
ultimo resto : cifrapiu’ significativa
ultimo resto : cifrapiu’ significativa
11*
Si considera poi la parte decimale, eseguendo Si considera poi la parte decimale, eseguendo moltiplicazioni moltiplicazioni successive per successive per 22 fino fino a quando il risultato fa a quando il risultato fa 0 0 oppure finche’ si e’ raggiunta la precisione desiderata.oppure finche’ si e’ raggiunta la precisione desiderata.Le cifre ottenute sono la parte a destra del punto.Le cifre ottenute sono la parte a destra del punto.22
x x xx x x xx
La parte intera del risultato diventa una cifra binaria. La parte decimale viene ancora moltiplicata per labase 2
La parte intera del risultato diventa una cifra binaria. La parte decimale viene ancora moltiplicata per labase 2
..
primo parte intera : cifradecimale piu’ significativa
primo parte intera : cifradecimale piu’ significativa
cifra decimalemeno significativa
cifra decimalemeno significativa
La parte decimale del risultatodella moltiplicazione non e’ 0, ma la precisione raggiunta misoddisfa. Termino il procedimento.
La parte decimale del risultatodella moltiplicazione non e’ 0, ma la precisione raggiunta misoddisfa. Termino il procedimento.
Risultato finale : 29.2 decimale Risultato finale : 29.2 decimale binario binarioRisultato finale : 29.2 decimale Risultato finale : 29.2 decimale binario binario
12*
Esempio : passare da 139 decimale al corrispettivo ottaleEsempio : passare da 139 decimale al corrispettivo ottaleEsempio : passare da 139 decimale al corrispettivo ottaleEsempio : passare da 139 decimale al corrispettivo ottale
E’ gia’ un numero intero, cosi’ dovro’ solo eseguire il passaggio E’ gia’ un numero intero, cosi’ dovro’ solo eseguire il passaggio 1 1 dell’esempio precedente. Ora eseguo dell’esempio precedente. Ora eseguo divisionidivisioni successive per successive per 88 fino a fino a quando il risultato fa quando il risultato fa 00. Le cifre ottenute sono il numero ottale . Le cifre ottenute sono il numero ottale corrispondente a quello decimale.corrispondente a quello decimale.
il risultato della divisione e’ 0, il procedimento e’finito
il risultato della divisione e’ 0, il procedimento e’finito
primo resto : ciframeno significativa
primo resto : ciframeno significativa
ultimo resto : cifrapiu’ significativa
ultimo resto : cifrapiu’ significativa
Risultato finale : 139 decimale Risultato finale : 139 decimale ottale ottaleRisultato finale : 139 decimale Risultato finale : 139 decimale ottale ottale
13*
Esempio : passare da 139 decimale al corrispettivo esadecimaleEsempio : passare da 139 decimale al corrispettivo esadecimaleEsempio : passare da 139 decimale al corrispettivo esadecimaleEsempio : passare da 139 decimale al corrispettivo esadecimale
E’ gia’ un numero intero, cosi’ dovro’ solo eseguire il passaggio E’ gia’ un numero intero, cosi’ dovro’ solo eseguire il passaggio 1 1 dell’esempio precedente. Ora eseguo dell’esempio precedente. Ora eseguo divisionidivisioni successive per successive per 1616 fino a fino a quando il risultato fa quando il risultato fa 00. Le cifre ottenute sono il numero esadecimale . Le cifre ottenute sono il numero esadecimale corrispondente a quello decimale.corrispondente a quello decimale.
il risultato della divisione e’ 0, il procedimento e’finito
il risultato della divisione e’ 0, il procedimento e’finito
primo resto : ciframeno significativa
primo resto : ciframeno significativa
ultimo resto : cifrapiu’ significativa
ultimo resto : cifrapiu’ significativa
Risultato finale : 139 decimale Risultato finale : 139 decimale esadecimale esadecimaleRisultato finale : 139 decimale Risultato finale : 139 decimale esadecimale esadecimale
14*
7.3 Come passare da un numero ottale od7.3 Come passare da un numero ottale odesadecimale al corrispondente binario e viceversaesadecimale al corrispondente binario e viceversa7.3 Come passare da un numero ottale od7.3 Come passare da un numero ottale odesadecimale al corrispondente binario e viceversaesadecimale al corrispondente binario e viceversa
Passare da un numero ottale od esadecimale al corrispondente binario e’ molto facile ePassare da un numero ottale od esadecimale al corrispondente binario e’ molto facile eviene illustra to negli esempi che seguono. Anche il viceversa non comporta calcoli viene illustra to negli esempi che seguono. Anche il viceversa non comporta calcoli particolarmente difficili. Capiamo cosi’ anche perche’ i numeri ottali od esadecimale particolarmente difficili. Capiamo cosi’ anche perche’ i numeri ottali od esadecimale vengano preferiti, quando possibile, ai binari : sono molto piu’ sintetici di quest’ultimi vengano preferiti, quando possibile, ai binari : sono molto piu’ sintetici di quest’ultimi (necessitano di minori numero di digits per descrivere lo stesso numero) e si possono (necessitano di minori numero di digits per descrivere lo stesso numero) e si possono all’occorrenza trasformare in binari molto facilmente. all’occorrenza trasformare in binari molto facilmente.
15*
Esempio : passare da 172 ottale al corrispettivo binarioEsempio : passare da 172 ottale al corrispettivo binarioEsempio : passare da 172 ottale al corrispettivo binarioEsempio : passare da 172 ottale al corrispettivo binario
per ogni cifraottale scrivo icorrispondenti3 digits binari
per ogni cifraottale scrivo icorrispondenti3 digits binari il numero binario
corrispondente siottiene accostandonell’ordine i digitsbinari
il numero binariocorrispondente siottiene accostandonell’ordine i digitsbinari
Esempio : passare da 1010001 binario al corrispettivo ottaleEsempio : passare da 1010001 binario al corrispettivo ottaleEsempio : passare da 1010001 binario al corrispettivo ottaleEsempio : passare da 1010001 binario al corrispettivo ottale
faccio l’operazione inversa a quelladi prima. Sostituisco ai 3 digits binariil corrispondente numero ottale
faccio l’operazione inversa a quelladi prima. Sostituisco ai 3 digits binariil corrispondente numero ottale
Inizio suddividendo, Inizio suddividendo, PARTENDO DA DESTRAPARTENDO DA DESTRA, il numero binario di , il numero binario di 33 cifre in cifre in 33 cifre. cifre.Ad ogni terzina sostituisco la corrispondente cifra ottale.Ad ogni terzina sostituisco la corrispondente cifra ottale.
Risultato finale : 172 ottale Risultato finale : 172 ottale binario binarioRisultato finale : 172 ottale Risultato finale : 172 ottale binario binario
Risultato finale : 1010001 binario Risultato finale : 1010001 binario ottale ottaleRisultato finale : 1010001 binario Risultato finale : 1010001 binario ottale ottale
16*
Esempio : passare da 1D8 esadecimale al corrispettivo binarioEsempio : passare da 1D8 esadecimale al corrispettivo binarioEsempio : passare da 1D8 esadecimale al corrispettivo binarioEsempio : passare da 1D8 esadecimale al corrispettivo binario
DD
per ogni cifraesadeciamle scrivoi corrispondenti4 digits binari
per ogni cifraesadeciamle scrivoi corrispondenti4 digits binari il numero binario
corrispondente siottiene accostandonell’ordine i digitsbinari
il numero binariocorrispondente siottiene accostandonell’ordine i digitsbinari
Esempio : passare da 10111100110 binario al corrispettivo esadecimaleEsempio : passare da 10111100110 binario al corrispettivo esadecimaleEsempio : passare da 10111100110 binario al corrispettivo esadecimaleEsempio : passare da 10111100110 binario al corrispettivo esadecimale
faccio l’operazione inversa a quelladi prima. Sostituisco ai 4 digits binariil corrispondente numero esadecimale
faccio l’operazione inversa a quelladi prima. Sostituisco ai 4 digits binariil corrispondente numero esadecimale
Inizio suddividendo, Inizio suddividendo, PARTENDO DA DESTRAPARTENDO DA DESTRA, il numero binario di , il numero binario di 44 cifre in cifre in 4 4 cifre.cifre.Ad ogni quaterna sostituisco la corrispondente cifra esadecimale.Ad ogni quaterna sostituisco la corrispondente cifra esadecimale.
Risultato finale : 1D8 ottale Risultato finale : 1D8 ottale binario binarioRisultato finale : 1D8 ottale Risultato finale : 1D8 ottale binario binario
Risultato finale : 10111100110 binario Risultato finale : 10111100110 binario esadecimale esadecimaleRisultato finale : 10111100110 binario Risultato finale : 10111100110 binario esadecimale esadecimale
17*
7.4 Somma tra numeri binari, ottali, esadecimali7.4 Somma tra numeri binari, ottali, esadecimali7.4 Somma tra numeri binari, ottali, esadecimali7.4 Somma tra numeri binari, ottali, esadecimali
Valgono la stesse regole di somma e di riporto valide pei numeri decimali. Ancora una Valgono la stesse regole di somma e di riporto valide pei numeri decimali. Ancora una volta chiariamo queste regole con degli esempi.volta chiariamo queste regole con degli esempi.
Esempio : eseguire la somma (decimale) 29 + 233 coi corrispondentiEsempio : eseguire la somma (decimale) 29 + 233 coi corrispondentinumeri binari, ottali, esadecimalinumeri binari, ottali, esadecimali
Esempio : eseguire la somma (decimale) 29 + 233 coi corrispondentiEsempio : eseguire la somma (decimale) 29 + 233 coi corrispondentinumeri binari, ottali, esadecimalinumeri binari, ottali, esadecimali
Base Base 1010Base Base 1010 Base Base 22Base Base 22 Base Base 88Base Base 88 Base Base 1616Base Base 1616
11101 +11101001 =
111 0 00000
29 +
233 =
262
35 +351 =
604
1D +E9 =
601
riportiriporti
18*
7.5 Moltiplicazione tra numeri binari, ottali,7.5 Moltiplicazione tra numeri binari, ottali, esadecimaliesadecimali7.5 Moltiplicazione tra numeri binari, ottali,7.5 Moltiplicazione tra numeri binari, ottali, esadecimaliesadecimali
Valgono la stesse regole di moltiplicazioni parziali valide pei numeri decimali. Ancora Valgono la stesse regole di moltiplicazioni parziali valide pei numeri decimali. Ancora una volta chiariamo queste regole con degli esempi.una volta chiariamo queste regole con degli esempi.
Esempio : eseguire la moltiplicazione (decimale) 20 Esempio : eseguire la moltiplicazione (decimale) 20 21 coi corrispondenti 21 coi corrispondentinumeri binari, ottali, esadecimalinumeri binari, ottali, esadecimali
Esempio : eseguire la moltiplicazione (decimale) 20 Esempio : eseguire la moltiplicazione (decimale) 20 21 coi corrispondenti 21 coi corrispondentinumeri binari, ottali, esadecimalinumeri binari, ottali, esadecimali
Base Base 1010Base Base 1010 Base Base 22Base Base 22 Base Base 88Base Base 88 Base Base 1616Base Base 1616
20 x21 =
1010000000
10100
1010000000
110100100
2040
420
14450
644
6414
1A4
10100 x =11 10 010 01 1
24 x =2525
14 x =1551
19*
Computer : insieme di circuiti elettronici + sistemi elettromeccanici (tastiera,
stampante, monitors). Puo’ eseguire calcoli ed operazioni basandosi su istruzioni che vengono messe nella memoria allo scopo di manipolare dati (input) e produrre risultati (output)
Sequenza di istruzioni = programma
Un computer e’ formato (almeno) dalle seguenti parti essenziali
) Memoria : insieme di dispositivi magnetici (nastri, dischi) ottici (dischi laser) o di circuiti elettronici (ad es. la RAM = random access memory) dove vengono conservate le informazioni (istruzioni dei programmi, dati di input, dati di output). La memoria a rapido accesso di solito e’ di dimensioni non molto grandi ed e’ di tipo transitorio. Vi accede di solito la CPU durante il processo di calcolo. La memoria di massa invece e’ di tipo permanente, e serve per immagazzinare grandi quantita’ di dati, e vi si accede in modo piu’ lento. Ciascun insieme di dati e’ chiamato file.
20*
2) CPU (central processor unit) costituito da (almeno) due parti : una parte che acquisisce le istruzioni del programma e le decodifica, una parte aritmetica che fa i calcoli.3) Dispositivo di input : tastiera del computer, lettore di nastri, lettore di dischi etc. Serve per dare comandi e fornire dati4) Dispositivo di output : video, stampante etc. Dispositivi per raccogliere i risultati.
CPU
Memoria RAM
ingresso uscita
Memoria di massa
periferica periferica
periferica
Parte centrale
21*
La parte centrale (CPU, RAM) e’ costituita da circuiti elettronci veloci, al giorno
d’oggi i clock piu’ veloci raggiungono GHz. La memoria di massa ed i dispositivi di input/output possono essere costituiti anche da parti meccaniche (tastiera, dischi) e l’accesso e’ piu’ lento. Di solito il passaggio dei dati tra unita’ lente ed unita’ veloci vengono gestiti in modo automatico senza usare la CPU. Le unita’ piu’ lente in linea di principio potrebbero essere staccate senza pregiudicare il funzionamento della parte centrale e per questo vengono dette unita’ periferiche.
Le memorie e la CPU sono composte da parole (da registri nel caso della CPU). Ogni
parola e’ composta da bytes ed ogni byte e’ composto da 8 bits. Un bit e’ un oggetto (ad es. un microcircuito elettronico bistabile; del materiale magnetizzabile di un disco o di un nastro etc.) che puo’ trovarsi in DUE stati i quali simboleggiano la cifra 0 e la cifra 1 rispettivamente. In tal modo ad ogni parola o registro (che spesso al giorno d’oggi e’ composta da 8 bytes, cioe’ 64 bits) e’ associabile un numero binario. Tutti i dati (numeri, lettere e caratteri, istruzioni di un programma) vengono codificati in numeri binari.
22*
Il numero viene messo in una parola di 32 bits col suo equivalente binario :
La parola Roma viene immagazzinata usando per ciascuna lettera byte e codificando con il codice ASCII
R ; o ; m ; a
I bytes vengono ‘accostati’ l’uno all’altro formando una parola di 32 bits in totale. Nell’accostarli il carattere piu’ a sinistra viene messo dalla parte dei bits meno significativi (cioe’ quelli per cosi’ dire ‘piu’ a destra’) compiendo cosi’ in un certo senso una ‘inversione’.Quindi alla fine Roma viene immagazzinata in 32 bits come segue :
Il codice ASCII originariamente era uno standard USA; oggi e’ diventato internazionale. La codificazione dei caratteri e’ ‘machine independent’ e quindi permette di trasportare facilmente qualsiasi file di informazione da un computer ad un altro.
23*
Tabella ASCII X3.4-1977Tabella ASCII X3.4-1977http://www.cs.utk.edu/~shuford/terminal/ascii_table.txt
24*
Il computer per eseguire il programma obbedisce ad una sequenza di istruzioni. Le
istruzioni, al livello piu’ basso, vengono scritte in ciascuna parola del file contenente il programma, in CODICE MACCHINA, che dipende dal particolare computer. Ad esempio, una parola del tipo potrebbe significare : prendi il contenuto della locazione di memoria chiamata B e copialo nel registro n. 3 della CPU.
Storicamente il codice macchina fu il primo linguaggio sviluppato. In seguito, per
motivi di praticita’ fu introdotto il linguaggio assemblatore (ASSEMBLER) che usa forme mnemoniche piu’ facili da ricordarsi. Ad esempio, l’istruzione precedente potrebbe avere il suo equivalente assembler in LDX 3 B dove LDX sta per load (carica). Anche l’assembler dipende dal particolare computer, ed una istruzione assembler corrisponde ad una operazione della CPU.
Istruzioni e linguaggi dei computersIstruzioni e linguaggi dei computers
25*
Successivamente all’assembler furono inventati i linguaggi ad alto livello che hanno
una sintassi indipendente dal particolare computer e permette al programmatore di scrivere istruzioni senza dover conoscere alcunche’ del linguaggio macchina. Il programmatore dovra’ dunque scrivere un file ASCII in cui sono contenute le istruzioni del programma. Ciascun computer d’altra parte, dovra’ essere dotato di un COMPILATORE cioe’ di un programma in grado di trasformare automaticamente qualunque file ASCII di istruzioni del linguaggio ad alto livello in un file contenete l’equivalente in codice macchina.
Le istruzioni del linguaggio ad alto livello avranno una sintassi facile da ricordare ed
usare, con comandi che corrispondono a piu’ comandi di codice macchina. Sara’ cosi’ possibile usare un programma su qualunque macchina, a patto che abbia il compilatore adatto, e verra’ facilitato lo sviluppo di programmi (software) anche complessi da parte di piu’ persone. Il FORTRAN 77 (ForTran = Formula Translation) e’ un linguaggio ad alto livello. Altri esempi sono : COBOL, PASCAL, BASIC, C, C++. Il Fortran 77 venne codificato nel 1980. E’ specialmente adatto per fare calcoli numerici per progetti, simulazioni, etc. Per questo linguaggio esistono inoltre molte librerie, cioe’ raccolte di programmi gia’ scritti nel corso degli anni che semplificano ed alleviano la mole di lavoro al programmatore.
26*
I computers odierni in generale sfruttano il principio della multiprogrammazione
(multitasking) che si basa sul fatto che il tempo con cui una CPU esegue calcoli matematici o logici e’ molto inferiore al tempo con cui il computer trasferisce i dati dall’input alla CPU o dalla CPU all’output. Si risparmia tempo complessivamente se si eseguono piu’ programmi in una volta e mentre i dati di un programma vengono trasferiti (in maniera automatica che non coinvolge la CPU) la CPU esegue calcoli per un altro programma.
Un altro principio oggi seguito e’ quello del time sharing che permette l’uso del
computer da parte di piu’ utenti alla volta che di solito agiscono da terminale (modo interattivo). Ciascun utente ha il diritto di usare il computer per una frazione di tempo, che dipende dal numero totali di utenti presenti in quel momento, ed interagisce direttamente col computer. Dato che il terminale ha bassa velocita’ di input (dovuto soprattutto alla lentezza umana ma anche alla bassa velocita’ intrinseca del terminale rispetto ad una CPU) il computer puo’ servire piu’ utenti alla volta senza che quest’ultimi in pratica ne risentano troppo.
Multitasking e time sharingMultitasking e time sharing
27*
Ogni computer usa un proprio sistema operativo che non e’ altro che un programma
sempre in funzione sulla macchina quando l’utente non sta facendo girare il proprio. Il sistema operativo permette al programmatore di definire tutte le operazioni che la macchina deve fare, come ad esempio compilare un file di istruzioni fortran (simbolico), eseguirlo, creare dei files, fare una lista dei files presenti in memoria, spedire un messagio per posta elettronica (e-mail) e mille altre funzioni (applicazioni). Quando un utente incomincia una sessione sul computer (login) il sistema operativo viene messo automaticamente in funzione. Il sistema operativo riconosce il linguaggio di controllo del lavoro (JCL) che l’utente dovra’ usare. Sfortunatamente fino a pochi anni fa ogni computer aveva JCL propri, e l’utente doveva impararsi i linguaggi di controllo per ciascun computer.
Un grosso passo avanti nella standardizzazione e’ stato compiuto con l’introduzione di UNIX, un sistema operativo concepito inizialmente nel 1969 da Ken Thompson e da allora sviluppato da molti ed oggi usato quasi universalmente. Una versione di Unix molto usataoggigiorno (ad es. sui PC) e’ LINUX .Esistono diverse versioni di JCL per Unix, che tra loro non differiscono moltissimo. Quelle oggi piu’ in auge si puo’ dire siano la Bourne shell (sh) , la C shell (csh) , la Korn shell (ksh)). Noi useremo la C shell.
Sistema operativoSistema operativo
UnixUnix
28*
Come cominciare una sessione dal PC del laboratorioCome cominciare una sessione dal PC del laboratorioa) Cercare l’applicazione Telnet e connettersi ad axppv.pv.infn.itb) Eseguire il login :Trying 192.84.142.1 …Connected to decux1.pv.infn.itEscape character is ‘^]’
Digital UNIX (decux1.pv.infn.it) (ttyp1)
login: bocaPassword:Last login: Wed Dec 29 20:09:56 from axppv.pv.infn.it
Digital UNIX V4.0D (Rev. 878); Tue Dec 28 16:36:44 MET 1999*******************************************************************decux1>
username
Password (non compare)
29*
Cambiare la passwordCambiare la password
La password deve avere da 6 a 8 caratteri (in molti computers puo’ essere piu’ lunga).
Comando : passwd
D’ora in avanti la notazione in blu verra’ usata per indicare i caratteri che vengono
scritti al terminale in input dall’utente, in verde i caratteri scritti in risposta dal computer, mentre la notazione in corsivo verra’ usata per simboleggiare dei caratteri da scrivere o per indicare cose da fare da parte dell’utente
L’utente BOCA vuole cambiare la sua passwordpasswdChanging password for boca.
Old password: vecchia passwordNew password: nuova passwordVerification: riscrivo la nuova password per sicurezza
30*
DirectoriesDirectories
In memoria, per esigenze di ordine e comprensione, e’ molto utile organizzare gruppi di
files in directories. Questo significa che ogni file viene associato ad una directory.In UNIX ciascun file viene di conseguenza identificato come segue : directoryname/filename Dopo che si e’ fatto il login nel computer ci si trova automaticamente nella home directory che, ad esempio, per l’utente boca su axppv1.pv.infn.it si chiama /home/boca Se a questa directory fosse associato ad esempio il file prova allora il nome completo del file sarebbe /home/boca/prova Esistono comandi per associare un file ad una particolare directory, per fare la lista di tutti i files che appartengono ad una data directory, ed un comando per sapere in che directory ci si trova (cioe’ sapere qual’e’ la directory di default ). Directory di default significa la directory che viene sottointesa automaticamente - a meno che essa venga esplicitamente indicata - in tutti i comandi Unix. Percio’ se non ci sono esplicite indicazioni, quando si crea un nuovo file esso viene associato alla directory di default; quando si fa una lista di files esistenti tale lista e’ quella dei files associati alla direcotry di default ecc. ecc.
31*
Sapere in che directory ci si trova (directory di default)Sapere in che directory ci si trova (directory di default)
Si usa il comando pwd
Creazione di una nuova directoryCreazione di una nuova directory
L’utente puo’ creare una nuova directory col comando mkdir
pwd/home/bocamkdir dimostrazioneA questo punto e’ stata creata una nuova directory il cui nome completo e’ : /home/boca/dimostrazionecioe’ alla directory di default e’ stata aggiunta una / e poi il nome dimostrazione
pwd/home/boca questo e’ il nome della corrente directory di default
32*
Cambio di directoryCambio di directoryPer cambiare la directory di default di usa cd
Elenco dei files appartenenti ad una data directoryElenco dei files appartenenti ad una data directory e/o aventi un certo nomee/o aventi un certo nome Si usa il comando ls nomedirectory oppure ls nomefile
pwd/usr/users/bocacd dimostrazionepwd/usr/users/boca/dimostrazioneL’utente boca si trovava inizialmente nella directory /usr/users/boca, quindi col comando cd ha definito come directory di default quella vecchia (/usr/users/boca) + /dimostrazione e quindi ora si trova nella directory /usr/users/boca/dimostrazione come e’ dimostrato dal susseguente comando pwd
33*
ESEMPIOESEMPIOls /usr/users/boca/cestinoprova prova.bak prova prova.bakL’utente boca ha richiesto l’elenco dei files appartenenti alla directory /usr/users/boca/cestino ed il computer ha elencato i files esistenti cioe’ prova prova.bak prova e prova.bakESEMPIOESEMPIOpwd/usr/users/boca/cestinolsprova prova.bak prova prova.bakIn questo secondo esempio l’utente boca si trovava gia’ nella directory /usr/users/boca/cestino (come testimonia il comando pwd) ed ha mandato il comando ls senza specificare alcuna directory : il computer percio’ ha assunto come directory quella di default. Il risultato dell’elenco e’ percio’ identico a quello dell’esempio precedente.ESEMPIOESEMPIOls /usr/users/boca/cestino/provaprovaIn questo esempio l’utente ha richiesto una lista di uno specifico file.ESEMPIOESEMPIOls /usr/users/boca/cestino/pro*prova prova.bak prova prova.bakIn questo esempio si e’ richiesto l’elenco di tutti i files che iniziano per pro nella directory /usr/users/boca/cestino Si noti l’uso dell’asterisco (carattere speciale o metacarattere) che significa qualunque numero e tipo di carattere di seguito ai caratteri pro
34*
Per produrre un programma fortran bisogna tradurre il file ASCII che contiene le istruzioni in un file che contiene le istruzioni macchina. Per fare questo in UNIX c’e’ il comando
f77 -static -o nomeoutput nomeinput
lsprova.forf77 statico prova.exe prova.forlsprova.for prova.exeL’utente ha compilato (e ne ha anche fatto il linking) del simbolico (scritto in ASCII) contenuto nel file prova.for il risultato (programma eseguibile) e’ stato messo nel nuovo file prova.exe
Compilazione di simbolici FortranCompilazione di simbolici Fortran
35*
Si possono usare diversi comandi per farlo. Ad esempio c’e’
cat nomefile
oppure
more nomefile
con cat il file viene stampato interamente e di seguito, con more il file viene interamente stampato, ma con la possibilita’ di vederlo per pagine. Nomefile puo’ esseresia il nome completo del file (cioe’ con all’inizio la directory alla quale appartiene) oppure puo’ non avere la directory di appartenenza, nel qual caso il computer assume la directory di default.
Stampa del contenuto di un file ASCII a terminaleStampa del contenuto di un file ASCII a terminale
36*
lsprova prova.bak prova prova.bakrm prova.baklsprova prova prova.bakL’utente ha rimosso dalla corrente directory il file prova.bak dalla directory di default, come e’ testimoniato dal comando ls eseguito dopo la rimozione
Si usa il comandorm nomefileAl solito, se nomefile non e’ il nome completo di directory, viene assunta la directory didefault.
In UNIX esite la possibilita’ di richiedere informazioni su come funziona un dato comando. L’istruzione da dare a terminale e’man nomecomandoAd esempio, se si vogliono informazioni dettagliate sul comando ls basta battere man ls ed una lunga lista di istruzioni comparira’ sul terminale, con la possibilita’ di vederlo per pagine.
Richiesta di istruzioni sull’uso di un comandoRichiesta di istruzioni sull’uso di un comando
Rimozione di un fileRimozione di un file
37*
Una necessita’ che si presenta spessissimo nell’uso di un computer, e’ il creare o
modificare dei files ASCII. Il text editor e’ un programma che fa questo. Ci sono svariati tipi di text editors, noi useremo vi oppure nedit Il comando e’
vi nomefile oppure nedit nomefile
dove nomefile puo’ essere sia un file nuovo che un file gia’ esistente. Come sempre, se ladirectory non e’ esplicitata nel nome del file, quella di default viene assunta. L’uso ed i comandi di vi ed nedit sono articolati e complessi e se ne puo’ avere il dettaglio coni comandiman vioppureman nedit
Creazione di un file ASCII con un text editorCreazione di un file ASCII con un text editor
38*
Unix e’ concepito specialmente per macchine multiuser e multitasking
Schematicamente un sistema operativo e’ fatto a strati, con un nocciolo di funzioni e
programmi piu’ interne (kernel) e 3 strati via via piu’ esterni.Le funzioni del kernel controllanodirettamente l’hardware del computer(controllo della memoria e dellaCPU e delle varie periferiche).Le funzioni dello strato systemservices chiamano le funzionidel kernel. Il linguaggioASSEMBLER fa uso dellefunzioni di questo strato.
user interfaceutilities and toolssystem serviceskernel
Architettura di un sistema operativoArchitettura di un sistema operativo
39*
A volte anche linguaggi a piu’ alto livello chiamano queste routines per ottenere maggiorerapidita’ di esecuzione. Il software dello strato utilities and tools rende la complessita’ dellechiamate alle routines del system service trasparente all’utente. In questo strato ci sono ad esempio i compilatori dei linguaggi ad alto livello ( fortran, C, C++, cobol, pascal, etc. ), la utilities mail od il tool dbx ( debugger di programmi fortran). Distinguiamo le utilities dai tools sulla base della maggior complessita’ delle prime rispetto ai secondi. Nello strato piu’esterno infine, c’e’ l’interfaccia con l’utente cioe’ la shell o command language interpreter,che viene usato per impartire i comandi al computer.
Le shell che sono diventate d’uso piu’ comune in Unix sono :
Bourne shell ( sh ) storicamente la prima disponibile, che viene inclusa in tutte le versioni di UnixC shell ( csh ) standard nei sistemi che usano il software Berkeley Software DistributionKorn shell ( ksh ) standard per il software Sistem V ( AT&T)
Le varie Unix shells differiscono tra loro per le funzioni che svolgono e per la sintassi dei lorocomandi, ma tutte passano il controllo alle stesse funzioni al momento dell’esecuzione, con l’eccezione di alcuni comandi tipici di quella shell.
40*
chshchanging shell for studente.Password:New shell [/bin/bash: /bin/tcshShell changed.
Per cambiare la shell di default si usa il comando :
chsh
Come cambiare la shell di defaultCome cambiare la shell di default
41*
Chiamiamo process un programma attivo. Quando un utente incomincia una nuova
sessione a terminale, viene attivato il programma costituito dalla shell usata per default, che attende ed esegue i comandi dati da terminale. Questo e’ un esempio di process a cui il sistema assegna un numero ( process identifier ) che unicamente lo identifica.Questo process ha accesso alle risorse della macchina ( CPU, memoria, periferici ) con una certa priorita’ che gli viene assegnata dal sistema stesso. La parte del kernel responsabile dello scheduling la assegna dinamicamente, aggiornandola ogni pochi secondi, calcolandola con un algoritmo complesso, che si basa anche su una priorita’ di base data dal system manager all’utente.
Come gia’ detto, al momento del login viene attivato un process ( la shell ). Questo e’ un
parent process . Quando diamo un comando da terminale, il process della shell vieneinterrotto ed un nuovo process, che esegue il comando, viene attivato. Quando quest’ultimotermina, il comando viene restituito alla shell, che riprende a funzionare. In Unix si dice chee’ stato generato un child process (quello che esegue il comando) da parte di unparent process (la shell).Questo meccanismo vien detto forking . Al child process vieneassegnato un proprio process identifier number. Un child process puo’ a sua volta iniziareun altro process, diventando a sua volta parent process di un child process.
Processi e loro priorita’Processi e loro priorita’
Parent process e child processParent process e child process
42*
Multitasking ( o multiprocessing ) significa l’attivazione, da parte di un solo utente, di piu’
programmi contemporaneamente. In Unix il multitasking si ottiene quando un parent process fa il forking di uno o piu’ child process e tutti i process sono attivi contemporaneamente. Un esempio di multitasking e’ la stampa di un file alla line printer, durante la quale si possono eseguire altri comandi. In Unix ci possono essere piu’ processattivi o sospesi contemporaneamente, ma solo uno puo’ ricevere input da terminale.Questo si dice process in foreground mentre gli altri sono in background .
Multitasking in UNIXMultitasking in UNIX
NOTA BENE NOTA BENE I processi attivi in background continuano anche quando il parent process che li ha lanciati esegue un logout dal computer. Se invece ci sono processi sospesi al momento del logout, allora un messaggio di avviso viene mandato a terminale ed il logout non viene eseguito. Se l’utente ripete il comando logout allora la sessione termina ed i processi interrotti vengono persi.
43*
I comandi per fermare, mettere in background o portare in foreground un processo sono :
1) <ctrl>c termina un child process ( job ) che e’ attivo in foreground2) <ctrl>z sospende l’esecuzione (ma non la termina) di un job che e’ attivo in foreground3) & lancia un child process in background4) fg n oppure fg %n porta in foreground un child process sospeso od attivo in background5) bg n oppure bg %n fa diventare attivo un process sospeso e lo porta in background
f77static o myfile.x myfile.f compilazione e link del file fortran myfile.f<ctrl>z la compilazione viene sospesaStopped messaggio a terminale, mandato del sistema, che avvisa della sospensionecat myfile.f stampa a terminale di myfile.ffg riporta in attivita’ in foreground, il process sospesof77 static o myfile.x myfile.f messaggio a terminale che avvisa della ripresa della compilazione e link
44*
Si definisce una shell script un ASCII file contenente dei comandi Unix.
In Unix si puo’ attivare una shell script semplicemente battendone a terminale il nomedel file ASCII che la la contiene. Quando si attiva uno script, il sistema esegue ciascuncomando dello script come se lo stessimo battendo da terminale
il seguente ASCII file e’ un esempio di shell script :ls l *cat pippomv pippo pluto
In una shell script, si usa il comando << label per indicare ad un programma quando finisce l’input che deve leggere.
Shell scriptsShell scripts
Il comando <<Il comando <<
45*
immaginiamo di avere il programma myprogram.x che legge 5 numeri da terminale e ne fa la media. Si consideri la seguente shell script :….myprogram.x << end9. 2.4 5.67.8 9.2end….Questo script, arriva all’esecuzione del comando myprogram.x ed il << fa si’ che tutte le righe a partire dalla successiva, fino a quella che precede la label end vengano considerate come dati in ingresso per il comando stesso. Se non ci fosse << end lo script prenderebbeinput per myprogram.x da terminale (standard input).
La creazione di una pipe e’ un tipo particolare di attivita’, sincronizzata dal kernel, che coinvolge piu’ processes, nella quale l’output di un comando diventa input del comando chesegue, senza bisogno di creare un file intermedio. Il piping e’ indicato dalla barraverticale | Questo comando e’ particolarmente utile e conferisce ad Unix una flessibilita’sconosciuta ad altri sistemi operativi.
PipingPiping
46*
anticipiamo qui che il comando who elenca gli usernames che hanno attualmente una
sessione aperta sul computer, mentre sort ordina alfabeticamente le righe di un testo
ASCII. Infine more stampa il contenuto di un file (interpretato come file ASCII) ad una
pagina per volta.
who | sort | more
questi tre comandi fan si’ che il kernel inizi 3 child process contemporaneamente,
corrispondenti ai comandi who , sort , more. Tuttavia more aspettera’ input da sort che
aspettera’ input da who . Quando l’output di who sara’ passato a sort , il child process
responsabile di who finira’, e cosi’ quando in seguito sort avra’ passato tutto l’output
a more, cessera’. Infine quando more avra’ finito di mandare output allo standard
output, terminera’ ed il controllo ritornera’ al parent process.
47*
Come gia’ detto piu’ sopra, in Unix vengono definiti
stdin input stream, solitamente la tastiera del terminale
stdout output stream, solitamente lo schermo del terminale
stderr device o file dove vengono mandati i messaggi di errore, di solito lo schermo del terminale.
In Unix e’ possibile, in modo semplice, comodo ed elegante, ridirezionare stdin , stdout ,stderr su devices o files che non siano quelli dati di default all’inizio della sessione (terminale), con i simboli della seguente tabella
Ridirezionamento dello standard input, output, errorRidirezionamento dello standard input, output, error
48*
simbolo significato > ridireziona stdout >! ridireziona stdout, senza tenere conto di noclobber >> ridireziona ed appendi stdout >>! ridireziona ed appendi stdout senza dare errore e creando un nuovo file se ancora non esiste >& ridireziona stdout e stderr >&! ridireziona stdout e stderr, senza tenere conto di noclobber >>& ridireziona ed appendi stdout e stderr >>&! ridireziona ed appendi stdout e stderr senza dare errore e creando un nuovo file se non esiste di gia’ < ridireziona stdin << xxx leggi l’input fino alla linea identica con xxx | ridireziona stdout al prossimo comando (piping) | tee nomefile ridireziona stdout, oltre che alla schermo, anche ad un file | & ridireziona stdout e stderr al prossimo comando
49*
ls > outputquesto comando fa si’ che l’output di lsvenga messo nel file (ASCII) output invece che visualizzato al terminale. Se il file output esistesse gia’, verrebbe sovrascritto dalla nuova versione ( in gergo Unix : clobbering ) e la vecchia versione verrebbe persa.L’utente puo’ impedire il clobbering (per evitare che uno sbaglio faccia perdere un file) con il comandoset noclobbercosi’ che il sistema avvisa che il file esiste gia’ ed impedisce l’esecuzione del comando.Un altro esempio e’ dato da :lsl >! outputlsl pippo* >>& outputdove prima viene ridirezionato l’output del comando ls l nel file output , facendo eseguire l’operazione ( grazie a ! ) anche se e’ stato fatto precedentemente set noclobber . Il secondo comando appende ( aggiunge ) il risultato del comando ls l pippo al file output.Anche eventuali messaggi di errore generati dal comando ls verrebbero stampati in output .
50*
I nomi dei files e dei comandi Unix sono case sensitive . Le MAIUSCOLE precedono le minuscole. Esistono delle convenzioni, non obbligatorie, ma generalmente seguite, riguardoalle estensioni che si danno ai files
estensione significato
.a libreria di objects .bas source code di basic .c source code di C .cc source code di C++ .f source code di fortran .h header file per il C .l programma di lex .o object file ottenuto dalla compilazione del source code .p source code per pascal .s source code di assembler .y programma id yacc a.out programma eseguibile
Nomi dei files in UNIXNomi dei files in UNIX
51*
Il comando
lsl t
fa una lista lunga ( opzione l ) di tutti i files presenti nella current directory ordinandoli temporalmente ( opzione t , i files piu’ recenti vengono elencati per primi). Stesso risultato si otterrebbe con
ls lt
Con poche eccezioni, la forma di un comando Unix e’ la seguente :nomecomando [ opzioni ] [ argomenti ]dove le [ ] significano che puo’ anche non esserci, e :• nomecomando sono generalmente lettere minuscole che caratterizzano il comando ;• le opzioni modificano l’azione del comando e di solito sono singole lettere precedute da ; si possono combinare assieme e di seguito piu’ opzioni facendole precedere da un unico oppure separatamente, con uno spazio in mezzo e precedute da
Struttura dei comandi UnixStruttura dei comandi Unix
52*
L’argomento e’ generalmente l’oggetto su cui agisce il comando
nomecomando , opzioni , argomento devono essere separati da spazi o tab che, tranne poche eccezioni, sono gli unici delimitatori validi in un comando Unix.
Si definisce word quei caratteri compresi tra due delimitatori consecutivi. Un semplice
comando Unix percio’, e’ una sequenza di una o piu’ words comprese tra spazi o tabs.
Vengono definite words separate (anche se sono in compagnia di altri caratteri) i caratteri & | < > ; ( ) # I caratteri && || << >> vengono considerate come una ( non due ) word.
il comando ls lte’ formato da 2 words, mentre il comandols lt | moree’ per Unix composto da 4 words.
53*
i seguenti comandi pwd ; ls ltsono equivalenti apwdls lt
Per continuare un comando sulla prossima riga si usa \ prima del return che termina la
linea ( deve essere l’ultimo carattere prima del return ).
Si possono mettere piu’ comandi su una stessa linea, separandoli con ; che, in questo
caso, ha la stessa funzione del carriage return.
54*
In Unix un file e’ identificato in maniera piu’ generale da
host:/ directory / filenamedove host: nome del computer dove il file risiede. Di solito host: si omette e viene usato solo da comandi come rcp o scp
directory nome della directory alla quale il file appartienefilename nome del file
• Si definisce file system un insieme di files e directories organizzato gerarchicamente, con una directory principale in cui ci possono essere files ed altre directories ; in quest’ultime ci possono essere altre directories, etc.
• / e’ il root file system
Devices, directories e struttura dei filesDevices, directories e struttura dei files
55*
il seguente e’ un esempio di /etc/fstab
In Unix non c’e’ la necessita’ di esplicitare il nome del device dove il file fisicamente risiede
(tranne nel caso sia un nastro). Il sistema Unix determina dove si trova il file andando a
leggere /etc/fstab che e’ il file sysem table, dove sono registrati su quali dischi stanno
fisicamente tutti i file systems.
56*
Il sistema utilizza /etc/fstab ad ogni reboot del computer per montare (assegnare) i varidevices fisici sugli appropriati file systems.
L’utente puo’ controllare con
df i file systems montati ed anche la percentuale di spazio rimasto a disposizione.
questo e’ un esempio del printout generato da df
57*
I devices piu’ comunemente usati, hanno in Unix nomi leggermente variabili a seconda della particolare implementazione e computer. Un esempio e’ dato nella seguente tabella
nome device descrizione
/dev/ra0 disk drive ( block ) /dev/rra0 disk drive ( character ) /dev/console system console /dev/tty01 asynchronous terminal /dev/printer default system printer /dev/mt0 tape drive ( block ) /dev/rmt0 tape drive ( character ) /dev/null cestino
Da notare l’esistenza di /dev/null che funziona da cestino. Mandandogli dell’output od
un file, questo viene perso. Analogamente, se si legge da /dev/null si ha subito un end of file. Il comandocp /dev/null myfileha l’effetto di creare il file myfile che e’ vuoto.
Nomi comunemente dati ad alcuni devicesNomi comunemente dati ad alcuni devices
58*
nome contenutodirectory
/bin files eseguibili di sistema, frequentemente usati /dev files speciali, che indirizzano devices /etc miscellanea di files vari /lib files di librerie /tmp files temporanei ( scratch files ) /usr/adm files amministrativi di sistema /usr/bin files eseguibili di sistema, meno frequentemente usati /usr/dict files del dizionario /usr/share/man files del manuale man /usr/spool files che devono essere spooled ( scaricati ) alle code stampanti /usr/tmp files di swap e page
In Unix vi sono delle convenzioni, solitamente seguite, sul nome da dare a directories checontengono particolari files, vedi tabella seguente.
Nomi comunemente dati ad alcuni directoriesNomi comunemente dati ad alcuni directories
59*
/home/boca/cestino/prova e’ un esempio di definizione assoluta di un file cd /home/boca/cestinols prova questo e’ un esempio di uso della definizione relativa di un file
La definizione esplicita di un file Unix per mezzo del nome completo a partire dalla root
directory / e’ detta definizione assoluta del file. Come gia’ detto altre volte, delle / delimitano il directory pathway attraverso tutte le sottodirectories. Tutte le definizioni di files che cominciano con / sono assolute. Invece, le definizioni che partono dalla current directory si dicono definizione relativa di un file e non cominciano mai con la barra.
Definizioni assolute e relative di filesDefinizioni assolute e relative di files
60*
ls l /home/boca/cestino questo e’ un esempio di ricerca dei files contenuti nella directory, indicata con definizione assoluta, /home/boca/cestino
cd /home/bocals l cestino questo e’ un esempio di ricerca di files contenuti nella stessa directory indicata, questa volta, con una definizione relativa a partire dalla directory /home/boca
ls ~boca la ~ seguita da uno username ( boca ) indica la home directory dell’utente ( in questo caso /home/boca ). Questo e’ un esempio di filename substitution (globbing ). Questo comando e’ in definitiva equivalente a ls /home/boca
cd /home/boca/cestinols l ../bin il doppio punto ( .. ) indica la directry appena sopra ( altro esempio di globbing). Il comando percio’ equivale a ls l /home/boca/bincd /home/bocalsl . il singolo punto indica la presente directory. Il comando percio’ equivale a ls l Anche questo e’ un altro esempio di globbing.
61*
Ci sono 3 tipi di files in Unix : i files speciali , i files ordinari ed i directory files.
a) Tutti i devices ( dischi, tape drivers, printers, terminali, e pseudoterminali - quelli usati durante le connessioni alla rete ) vengono trattati come files speciali i quali, come gia’ visto in precedenza, risiedono nella directory /dev Si ottiene un printout sulla line printer, ad esempio, scrivendo allo special file che individua la line printer. Questo normalmente viene fatto tramite i comandi della C-shell, ma in alcuni casi l’utente lo puo’ fare anche direttamente.
b) I files ordinari contengono caratteri ASCII o binari. Copiando un file ordinario in uno special file, si otterra’ l’output del contenuto sul device associato allo special file. Di default Unix NON formatta il file ( cioe’ non aggiunge bits al contenuto del file ) tranne per un <ctrl>D ( end of file ) alla fine del file. Casomai puo’ essere il comando o programma usato dall’utente ad interpretare o scrivere in certo modo i dati ( si pensi alla scrittura ASCII dei caratteri col Fortran 77, ad esempio ).
c) Dei directoy files si e’ gia’ parlato. Un directory file ha una entry per ciascun file contenuto nella directory ed oltre al nome del file ed altre informazioni, contiene anche l’ inode del file. Quest’ultimo e’ un numero che unicamente identifica ciascun file ( si puo’ vedere l’ inode con il comando ls i nomefile ).
Tipi di files in UnixTipi di files in Unix
62*
Sono una particolare classe di files ordinari, e cominciano il loro nome con un punto ( . )Il loro nome e’ dovuto al fatto che non vengo listati dal comando ls a meno che non si usi l’opzione a ( list all ). La tabella che segue fa un sommario dei principali hidden files e della loro funzione. Il motivo per cui sono ‘nascosti’ e’ che cosi’ l’utente ha meno probabilita’ di danneggiarli …. In realta’ l’utente li puo’ modificare per farli aderire alle proprie esigenze. Generalmente si trovano tutti nella directory $HOME dell’utente.
Hidden filesHidden files
63*
nome funzionehidden file
.cshrc eseguito all’inizio della sessione, ma dopo aver eseguito il .login di sistema e prima di aver chiamato il file $HOME/.login Solo se si usa la C-shell viene chiamato .cshrc Usualmente si usa per definire environmentals, alias e definire altre opzioni e paramentri.
.exrc definizione degli environmentals per l’editor ex .forward definisce il forwarding address per il mailer .history contiene la history list .hushlogin disabilita alcuni messaggi di login .login viene eseguito all’inizio della sessione, qualunque sia la shell di default
usata dall’utente. Qui si definiscono environmentals e si settano preferenze etc. che vanno usate indipendentemente dalla particolare shell usata.
.logout viene eseguito subito prima del termine della sessione. Qui l’utente mette tutto cio’ che vuole eseguire appena prima della chiusura della sessione.
.mailrc contiene le definizioni degli environmentals per il programma mail .netrc contiene i parametri per il programma ftp .profile analogo al file .cshrc tranne che viene eseguito ( dopo il .login sistema) se
si usa la Bourne shell .rhosts vengono indicati gli utenti e macchine remote alle quali lo user permette di
accedere al computer tramite il proprio account.
64*
In Unix alcuni caratteri vengono interpretati in modo speciale dalla shell e vengono chiamati
metacaratteri. La tabella che segue ne elenca alcuni di quelli non citati precedentemente peril redirecting ; quelli asteriscati hanno un significato speciale solo per la C-shell. Da notare che il significato di un metacarattere puo’ variare a seconda che venga interpretato dalla C-shell o da una Unix utility.
Caratteri specialiCaratteri speciali
65*
Il metacarattere ( wildcard ) ha in generale il significato di sostituzione di un numero arbitrario di caratteri arbitrari (vedi in seguito) ; il suo effetto tuttavia puo’ differire leggermente a secondo del comando Unix che lo usa.
ls questo comando produce la lista di tutti i files della directory corrente e delle directories ad un livello piu’ basso nella gerarchia delle directories ( in questo casoha un effetto maggiore che la semplice sostituzione ). Invece il comandowc produce il word counting per tutti e solo i files della directory corrente. Il comando
ls . invece, fa la lista della directory corrente soltanto, mentre
wc . interpreta il . letteralmente andando a fare il word counting di un file di nome . (se esiste).
66*
TABELLA DEI METACARATTERI ( I ) metacarattere funzione
& esegue il comando in background && and Booleano = operatore di assegnazione == uguale a ; e’ una comparazione di stringhe di caratteri != diverso da ; e’ una comparazione di stringhe di caratteri =~ simile a ; e’ una comparazione di stringhe di caratteri !~ dissimile da ; e’ una comparazione di stringhe di caratteri <= minore od uguale a >= maggiore od uguale || doppia barra ; or Booleano ; separatore di comandi \ comando di continuazione della linea di comando \m traduzione letterale del metacarattere m ‘ togli il significato speciale ` esegui immediatamente “ raggruppa i caratteri in un unico comando # seguono dei commenti fino al prossimo carriage return ! history substitution % significa un job in background * wildcard , sostituzione di qualunque numero e tipo di caratteri ? wildcard, sostituzione di un singolo carattere
67*
TABELLA DEI METACARATTERI ( II )metacarattere funzione
$ segue una sostituzione di argomento $# numero di argomenti passati ad uno shell script $$ Process ID $? Exit status $< legge una linea da stdin @ esegui un calcolo numerico ~ home directory substitution [ ] filename selective substitution
. current directory { } delimitatore usato in vari comandi
NOTA BENE NOTA BENE • Facendo precedere un metacarattere da \ ha l’effetto di toglierne il significato speciale (il metacarattere viene interpretato come carattere normale).• Facendo precedere \ ad un carriage return si fa diventare quest’ultimo equivalente ad uno spazio.• I caratteri racchiusi tra “ (double quotes) oppure ` (grave accents) oppure ‘ (single quotes) formano UNA word. I metacaratteri racchiusi non formano word separate. E’ possibile includere il carattere carriage return tra apici o apici doppi, a patto di farlo precedere da \
68*
In Unix alcuni metacaratteri vengono usati come wildcards, tipicamente per indicare
nomi di files. La wildcard non viene presa letteralmente dal sistema, ma ad essa vengonosostituiti uno o piu’ caratteri. Le wildcard in uso nella C shell sono indicate nella tabella seguente
WildcardsWildcards
TABELLA DELLE WILDCARDSwildcard funzione
nome composto da un qualunque numero di caratteri qualunque .com qualunque nome di file che termini in .compipp qualunque nome di file che inizia con pipp qualunque nome di file che contenga almeno un . ? sostituzione di UN (solo uno!) carattere qualunque ?.com qualunque nome di file che termini in .com preceduto da un carattere qualunque prova[xyz] le [] indicano sostituzione di uno dei caratteri contenuti nelle parentesi. Quindi in questo caso indica il nome di file provax oppure provay o oppure provaz prova[a-z] un qualunque nome tra quelli da provaa fino a provaz prova[a-z4] un qualunque nome tra quelli da provaa fino a provaz piu’ prova4 prova{o,f} stesso significato di prova[of]
69*
Quando si inizia una sessione Unix, occorre definire un certo numero di environmentals
o variabile di ambiente indispensabili per poter lavorare (vedi qualche trasparenza piu’sotto la spiegazione delle variabili d’ambiente).
Fortunatamente, in genere l’utente non deve preoccuparsi di queste definizioni che vengonoeffettuate dal login di sistema, e dalla esecuzione automatica della .cshrc e del .login che risiedono nella propria home directory.
70*
Quando il prompt del login appare sullo schermo, e l’utente fa il login, il sistema Unix
compie un certo numero di operazioni :il programma /etc/init legge una lookup table che si trova in /etc/ttys e che contiene una stringa per ogni device del tipo terminale ( /dev/tty ) o pseudo-terminale ( /dev/ptty ) disponibi le al sistema. Unix usa un descrittore di 5 caratteri : tty che indica terminale, poi un esadecimale per il numero di controller, un altro esadecimale per il numero di linea ( ad es. tty01 o ttyff ). Si puo’ usare il comando tty per sapere il nome del proprio terminale.
Poi /etc/init passa la stringa corrispondente al terminale al programma /etc/getty che
controlla se al nome del terminale corrisponde un’entry nella lookup table /etc/gettytab ed in caso positivo legge i parametri del terminale ( baud rate, parity, funzione del tasto<break> , etc. etc. ) altrimenti ne assegna di default.
Operazioni del sistema al momento del loginOperazioni del sistema al momento del login
71*
Quindi /etc/getty passa il controllo a /bin/login che chiede all’utente la password e la
confronta con quella ( incriptata ) contenuta nel file /etc/passwd e quindi, in caso positivo, assicura il permesso ad entrare nel sistema. Inoltre /bin/login updata le informazioni di accounting e cerca nel file /etc/group a quale gruppo l’utente appartiene. Un utente Unix puo’ appartenere a piu’ gruppi. L’appartenere ad un certo gruppo fa si’ che tutti i files dell’utente abbiano di default un certo tipo di protezione group level distinta da quellaworld level e da quella user level . Si puo’ usare il comando groups per sapere a che gruppo si appartiene. Quindi /bin/login invoca il programma /etc/environ che assegna le variabili di ambiente ( environmentals ) del sistema.
Infine /bin/login sempre grazie all’informazione contenuta in /etc/passwd assegna una
copia della shell di default al’utente. Normalmente la Bourne shell ha come prompt il $ , mentre la C-shell ha il %
In Unix tutti gli utenti hanno lo stesso tipo di privilegi, eccetto il superuser con login
name root che ha tutti i privilegi possibili ( e che normalmente e’ il manager del sistema).
Quando un utente si collega, appaiono allo schermo un certo numero di messaggi di
sistema che si possono eliminare creando il file ( anche vuoto ) .hushlogin nella propria home directory.
72*
Come detto, il file /etc/ttys contiene le informazioni relative al terminale usato dalla
presente sessione, incluso il tipo di terminale ( ad es. vt100 ). A questo terminal descriptor corrisponde una entry in un altro file, /etc/termcap nel quale ci sono altre informazioni su un gran numero di tipi di terminali di marche diverse. Queste informazioni sono in genere sufficienti perche’ la shell funzioni adeguatamente su quel terminale. In ogni momento della sessione l’utente puo’ cambiare quelle specifiche.
Nelle situazioni in cui terminali differenti usano la stessa porta del computer (ad es. linee
per modem, network connections, etc.) Unix fa corrispondere una generica definizione in /etc/ttys (ad es. dialup o network) ad una generica definizione in /etc/termcap . Poi l’utente potra’ modificare le caratteristiche del proprio terminale usando i comandi tset (che assegna le caratteristiche di input/output ad una sessione da terminale) e/o stty (che assegna le caratteristiche alla tastiera).Tali comandi sono piuttosto complicati. Ricordiamo qui solamente che setty e tset senzaopzioni fanno una lista delle caratteristiche correnti assegnate al terminale ed alla tastiera.
73*
Definizione diDefinizione di environmental o (o ( variabile d’ambiente variabile d’ambiente )) ::e’ una variabile, assegnata ad un process, che viene conservata in una locazione di memoriadel computer. Questa varibile ha un valore, assegnato dall’utente o dal sistema; le varibilid’ambiente valgono qualunque sia la shell usata dall’utente.
L’utente puo’ definire e/o assegnare un valore ad un environmental col comandosetenv ENVIRON valoredove ENVIRON e’ il nome della variabile, valore e’ il valore dato alla variabile.Una convenzione spesso seguita in Unix e’ quella di usare tutte lettere maiuscole per i nomidegli environmentals.Si puo’ eliminare una variabile d’ambiente conunsetenv ENVIRONe si puo’ stampare il valore di un environmental conprintenv ENVIRONmentre printenv senza argomenti, stampa a terminale tutti gli environmentals definiti peril processo corrente. Si puo’ anche usare il comando :echo $nomeenvironmentaldove nomeenvironmental e’ il nome della variabile. Si noti l’uso del metacarattere $ che attua un argument substitution .
Variabili d’ambiente (environmentals) e shell variablesVariabili d’ambiente (environmentals) e shell variables
Come assegnare, deassegnare, stampare il valore di unaCome assegnare, deassegnare, stampare il valore di unavariabile d’ambientevariabile d’ambiente
74*
setenv DEMO pincopallinoprintenv DEMOpincopallinounsetenv DEMOprintenv DEMOl’ultimo comando non produce output dato che la variabile DEMO e’ stata appena cancella-ta dall’utente col comando unsetenv L’utente boca ottiene la seguente stampa dopo aver dato printenv senza argomenti :
75*
Queste variabili sono analoghe agli environmentals eccetto che vengono definite ed hannovalidita’ solo nell’ambito della shell correntemente usata dall’utente ( ad es. la C-shell )cessando di esistere, per esempio, se l’utente cambia shell.
Nella C-shell l’utente puo’ usare il comandoset shellvar = valoreE’ una convenzione spesso usata in Unix di adoperare le lettere minuscole per definire levariabile di shell . Per eliminare una variabile di shell si usaunset shellvare per stampare il valore di una shell varible si usaecho $shellvar( notiamo il $ che e’ quello special character usato per l’ argument substitution ) mentreset senza argomenti stampa il valore di tutte le shell variables definite.
Shell variablesShell variables
Come assegnare, deassegnare, sampare il valoreCome assegnare, deassegnare, sampare il valoredi una variabile di shelldi una variabile di shell
76*
set prompt = “`hostname` >”decux1.pv.infn.it>
l’utente ha posto nella shell variable prompt (che poi viene stampata automaticamente dalsistema all’inizio di ogni nuova linea di comando) il valore dato dal risultato del comandohostname piu’ il simbolo >
77*
L’utente boca ottiene la seguente stampa dopo aver dato il comando set senza argomenti
78*
Come visto precedentemente, il file /etc/environ viene eseguito dal sistema al mo-mento del login per assegnare gli environmentals di sistema necessari per far funzionare lasessione. Nella tabella seguente sono elencati nome e significato di quelli piu’ comunementedefiniti.
TABELLA DEGLI ENVIRONMENTALS COMUNEMENTE DEFINITI DAL SISTEMA
nome significatoenvironmental
HOME home directory SHELL pathname per la shell usata di default TERM tipo di terminale USER user name LOGNAME login name PATH directories in cui cercare al momento di eseguire comandi non built-in EDITOR editor di default MAIL directory dove controllare se ci sono mail messages
Environmentals piu’ comunemente definiti al momentoEnvironmentals piu’ comunemente definiti al momentodel login di sistemadel login di sistema
79*
Molte delle shell variables assegnate dal sistema quando un’utente invoca la C-shell
hanno lo stesso nome (ma scritto in minuscole) e stesso significato degli environmentalscorrispondenti. Un esempio e’ la variabile home che solitamente corrisponde a HOME Nella tabella seguente sono elencate le variabili piu’ comunemente definite nellaC-shell ed il loro significato. Per togliere l’effetto di tali variabili bisogna usare il comandounset
Variabili di shell comunemente impiegate quandoVariabili di shell comunemente impiegate quandosi usa la C-shellsi usa la C-shell
Particolare importanza riveste l’environmental PATH che e’ usato dal sistema quando
l’utente manda un comando che non sia built-in. In questo caso il comando (che altro non e’che un programma) viene cercato nelle directories specificate da PATH, nell’ordine con cuisono scritte . Ciascuna directory e’ separata dalle altre da : (due punti).
80*
TABELLA DI ALCUNE SHELL VARIABLES COMUNEMENTE DEFINITE nome della significatoshell variable set autologout = n specifica il numero di minuti di idle time prima che una shell
interattiva termini set echo ripete i comandi dati dall’utente set history = n ricorda gli ultimi n comandi impartiti dall’utente set home = string assegna la home directory per la C-shell set ignoreeof impedisce che <ctrl>D faccia il logout della sessione set mail = string assegna la directory dove vengono messi i mail messages set noclobber impedisce la sovrascrittura accidentale durante la redirection set noglob impedisce l’espansione dei filenames set notify avvisa di quando un job e’ finito set path = string path in cui ricercare i comandi della C-shell set prompt = string assegna il prompt per la C-shell set savehist = n ricorda gli ultimi n comandi all’inizio di una nuova sessione set shell = string file dove si trova la shell status variabile che viene messa = 0 ( = buon esito del comando) od
ad un valore diverso da 0 (errore) quando finisce l’esecuzionedi determinati comandi
set time = n per ogni comando che duri piu’ di n secondi viene riportato ilCPU time e l’elapsed time
set verbose le parole usate per ciascun comando vengono ripetute
81*
L’hidden file .cshrc viene eseguito dopo il login di sistema, e nel caso che l’utente usi la
C-shell per default.Se invece viene usata la Bourne shell, allora viene eseguito il file .profileIn entrambi i casi, successivamente viene eseguito un altro hidden file, il .loginTutti questi file si trovano nella propria home directory e l’utente puo’ modificarli per fareseguire quei comandi o assegnare environmentals o shell variables all’inizio della sessione.Ogni volta che c’e’ un forking il child process riceve tutti gli environmentals definitinel login di sistema, nel .login e nel .cshrc (inoltre riceve tutte le definizioni di comandidefiniti con alias , vedi seguito).Questo succede ad es. quando l’utente impartisce un comando che non sia built-in nella shellin uso causando cosi’ il forking di un child process che esegue il comando.
Funzione degli hidden files .login, .cshrc e .profileFunzione degli hidden files .login, .cshrc e .profile
Comando aliasComando alias
Serve per abbreviare o comunque dare un nome equivalente ad un comando. Sintassi :alias nickname comandodove nickname e’ il nuovo nome del comando comando.
82*
alias ll “ls l”dopo questo aliasing quando l’utente impartisce il nuovo comando ll e’ come se battesseil comando ls l
Esempio di .cshrc fileIl seguente .cshrc file assegnera’ nuovi valori alle varibili sevehist , mail e prompt edefinisce i nuovi comandi ll e ceset savehist = 50set mail = $MAILset prompt = “!$USER”alias ll ls lalias ce “cd boca/cestino ; pwd”
Esempio di .login file
Qui vengono ridefiniti gli environmentals SHELL , TERM , EDITOR , MAILsetenv SHELL /bin/cshsetenv TERM vt100setenv EDITOR /usr/local/bin/X11/neditsetenv MAIL /usr/spool/mail/boca
83*
L’utente puo’ finire la sessione in due modi : con il comando logout o con il comando
<ctrl>D se ignoreeof non e’ stato assegnato (vedi sopra). <ctrl>D e’ un marker di endof file e percio’ quando la shell lo vede termina di funzionare (e cominciano le operazionidi logout).
In ogni caso, prima di terminare la shell esegue (se c’e’) una altro hidden file che risiede
nella home directory che e’ .logout In questo file l’utente puo’ mettere quei comandi che vuole che siano eseguiti prima che termini la sessione, come ad es. clear che ‘rinfresca’ lo screen del terminale.
Dopo aver eseguito il .logout il sistema esegue il file /etc/logout per le eventuali ultime
operazioni richieste dal sistema ed infine ripassa il comando al programma /etc/init (lo stesso che era stato attivato al momento del login ) per finire la sessione in modo standard.
Come gia’ accennato precedentemente, non e’ possibile il logout se ci sono
stopped process (il comando jobs fa una lista di tutti i process attivi e stopped). Tuttaviase il comando logout viene ripetuto la seconda volta, la sessione finisce ed gli stopped processes vengono persi.
Operazioni del sistema al momento del logoutOperazioni del sistema al momento del logout
84*
Trattiamo qui quali sono le possibilita’ di history substitution in Unix.
Comandi di history substitution in Unix (I) comando significato
history fa una lista degli ultimi comandi impartiti (history list) !! esegue il comando precedente !n esegue l’ n-esimo comando nella lista della storia dei comandi !string esegue l’ultimo comando che incomincia con string !?string? esegue l’ultimo comando che contiene string !-n esegue l’ n-esimo comando precedente
Come richiamare i comandi precedentiCome richiamare i comandi precedenti
85*
history 18:30 ls l t2 18:34 set ignoreeof3 18:35 ls prova.f4 18:36 more prova.f5 18:40 vi prova.f6 18:43 historyse ora l’utente impartisce da tastiera l’ordine!!ritornera’ ad eseguire il comando history che aveva precedentemente eseguito.Se invece impartira’ il comando ! tornera’ ad eseguire ls lt Se invece battesse a terminale!lsavrebbe come effetto di ripetere il comando ls prova.fSe battesse invece il comando!?rov?ritornerebbe ad eseguire il comando vi prova.f mentre se battesse !5verrebbe eseguito ancora set ignoreeof
86*
Negli esempi seguenti vengono elencati comandi di history substitution in cui vengonoinvece richiamate words appartenenti a comandi precedenti
history1 18:30 ls file1 file2 file3Nel comando precedente, ls e’ la word n. 0 , file1 e’ la word n. 1 etc.Se ora l’utente impartisce da tastiera l’ordinecat !1:1ottiene come effetto l’equivalente di cat file1 ovvero viene sostituita, al posto di !1:1 ,la word del comando n. della history list. Se invece impartisce l’ordinecat !1:ottienecat file1 file2 file3 (sostituzione di tutte le words da 1 in avanti del comando n. 1); invece, concat !1:$si ottiene cat file3 (sostituzione dell’ultima word);mentre con cat !1:2-3si ottiene cat file2 file3 (sostituzione delle words da 2 a 3); infine concat !1:2-3 file10si ottiene l’equivalente di cat file2 file3 file10 (espansione della linea di comando con nuovi argomenti).
87*
Infine, supponendo di impartire il comandocat file1 file2 file3 e susseguentementels !*si ottiene ls file1 file2 file3 cioe’ la sostituzione di tutte le words > 0 del comando precedente.
88*
sintassi : ^string1^string2 sostituisce string2 a string1 nel comandoprecedente
esempio : cat file^cat^lsls file
sintassi : !n:s/string1/string2/ sostituisce string2 a string1 nel comando nesempio : history
….7 18:31 cat file ….!7:s/cat/ls/ls file
sintassi : !n:p:s/string1/string2/ sostituisce string2 a string1 nel comando nma senza eseguire il comando risultante,solo facendolo vedere comunqueaggiungendolo alla history list
!! esegui il comando precedentemente mostratoesempio : !7:p:s/cat/ls
ls file!!ls file
Gli esempi che ora seguono implicano la sostituzione di nuove words in comandi
precedenti.
89*
In Unix esiste il comando man per ottenere informazione su un comando, una funzione, etc. L’output di questo comando ha in generale la forma (ma non per tutti i comandi e’ uguale, ci possono essere piu’ o meno dei paragrafi qui elencati) :
NAME nome del comando e suo propositoSYNOPSIS sommario del suo usoOPTIONS elenco delle possibili opzioni usabili con questo comandoOPERANDS elenco degli operandi su cui agisce il comandoDESCRIPTION descrizione in piu’ dettaglio del comandoSEE ALSO altri luoghi nel manuale dove trovare informazioni relateEXAMPLES esempi d’uso del comandoBUGS descrizione di bachi conosciuti, deficienze e modi di aggiustarli
se sono disponibiliRESTRICTIONS limitazioni che si conosconoAUTHORS autori del codice del comando
Le pagine di man risiedono nelle directories da /usr/share/man/mana /usr/share/man/man8 secondo la classificazione mostrata nella seguente tavola.Ad es. la man page per il comando cat si trova in /usr/man/man/cat.gz
Help online ( comandoHelp online ( comando manman ))
90*
Tavola delle pagine di man
numero di pagina contenuto1 comandi della shell2 funzioni di sistema (kernel access points) 3 librerie di subroutines4 descrizione degli input/output device driver5 include files e formats6 computer games7 special files8 system procedures
Inoltre, le sezioni e 3 sono suddivise come segue comandi general purposec comandi relati alla comunicazioneg comandi relati alla graficam comandi di system maintenance
3 libreria standard di subroutines3f routines di supporto del FORTRAN 773m subroutines di matematica3r librerie per internet network3s subroutines di input/output3x subroutines varie
91*
Ci sono 4 modi di usare man :• sintassi man comando esempio man cat nell’esempio sopra riportato, il computer cerca le pagine di man che si riferiscono al comando cat e l’output viene mandato a terminale
• sintassi man k keyword esempio man k terminal in questo esempio vengono listate tutte le informazioni relative alla parola chiave terminal. Il comando man k puo’ anche essere sostituito dal comando apropos
• sintassi man f comando esempio man f more questo comando produce una breve descrizione del comando more. Il comando man f e’ equivalente al comando whatis
• sintassi man sezione comando esempio man 3 stty in quest’ultimo esempio l’utente sa gia’ in quale sezione di man si trova l’informazione cercata e ne fa il display a terminale.
92*
Unix possiede numerosi comandi ed utilities per la creazione, modifica, il display di
files e directories. La tabella che segue riassume i comandi e le routines chiamabili daun programma scritto in Fortran 77 oppure da un programma scritto in C , per il filemanagement. Sono sottolineati quei comandi di cui in particolare tratteremo, gli altri sipossono approfondire con le pagine di man .Nella tabella vengono anche divisi i comandi che fanno un display di files o di lorocaratteristiche, da quelli che li manipolano. L’utente novizio puo’ usare i primi in tutta sicurezza in quanto i files non vengono modificati, mentre per quanto riguarda i secondi, si dovra’ prestare piu’ cura poiche’ il contenuto dei files potrebbe essere modificato.
93*
TABELLA DEI COMANDI O ROUTINES PER IL MANAGEMENT DI FILES E DIRECTORIES
Display commands
nome comando significatoo routine
cat stampa allo standard output del contenuto di un filecol filtra i reverse line feedcolcrt filtra nroff output per CRT (cathodic ray tube)fmt text formatterfold spezza linee lunghe di un file in piu’ linee di larghezza prefissatahead stampa le prime linee di un filels lista dei file esistenti e/o del contenuto di directoriesmore stampa allo standard output del contenuto di un file, a pagine per voltaod stampa allo standard output del contenuto di un file in ottale, decimale,
esadecimale od ASCIIpr stampa files allo stdouttail stampa l’ultima parte di un file allo stdout
94*
TABELLA DEI COMANDI O ROUTINES PER IL MANAGEMENT DI FILES E DIRECTORIES Manipulation commands riguardanti directories
nome comando significato
cd cambia la current directorychdir cambia la current directory - anche C callable routinegetdirentries trova le directory entries con formato indipendente dal file system
C callable routinegetwd trova il path name del current directory - C callable routinemkdir crea una nuova directorypwd stampa il path name della current directoryrmdir rimuove una directoryscandir, alphasort esamina una directory - C callable routineunlink rimuove una directory entry in una directory ; sia comando che
C callable routineManipulation commands riguardanti files (I)
ar comando che opera su librerieawk pattern scanning and processing languagebasename isola la base di un filenamebcopy, bcmp, bzero, ffs operazioni con stringe di bit o byte ; C callable routines
95*
TABELLA DEI COMANDI O ROUTINES PER IL MANAGEMENT DI FILES E DIRECTORIES Manipulation commands riguardanti files (II)
nome comando significato
checknr controlla files prodotti da nroff e/o troffchgrp cambia il gruppo associato con un file o con una directorychmod cambia la protezione di un file o directory ; sia comando che C routinecmp confronta due files per scoprirne le differenzecomm seleziona od elimina linee comuni a due filescp copia di un file o directorycreat crea un nuovo file ; C callable routinecrypt comando per incrittare o decriptare filescrypt, setkey, encrypt operazioni per incrittare / decriptarectags creazione di un tag filedd conversione e copia di un filediff confronto di 2 files ASCIIdiff3 confronto di 3 files ASCIIexpand, unexpand sostituisce gli spazi con i tabs o viceversafile determina il tipo di file (ASCII, eseguibile, command file etc.)find trova filesflock applica o rimuove un advisory lock su un file aperto ; C callable routine
96*
TABELLA DEI COMANDI O ROUTINES PER IL MANAGEMENT DI FILES E DIRECTORIES
Manipulation commands riguardanti files (III)
nome comando significato
ftp programma per trasferire files da un computer ad un altrogrep, egrep, fgrep ricerca di un pattern in un fileident identifica fileslink crea un link ad un file C callable routineln crea links per fileslockf crea un nuovo file ; C callable routinelook trova linee che cominciano con una certa stringa di caratteri, in filesmerge merge di filesmknod crea special files ( character, block, fifo )mktemp crea un file il cui nome sia unico C callable routinemv rinomina un filencheck elenca inode numbers e nomi di tutti i files in un file systemnroff formatta del testoopen apre un file per read o write ; C callable e Fortran callable routineqsort ordina una tabella ; C callable routineranlib converte archivi in random libraries veloci da consultare da parte di un
linker
97*
TABELLA DEI COMANDI O ROUTINES PER IL MANAGEMENT DI FILES E DIRECTORIES
Manipulation commands riguardanti files (IV)nome comando significatorcp, scp copia di files su una macchina remotaread legge una linea di input da stdinreadv legge input da stdin ; C callable routinereadlink stampa il contenuto di un file symbolic link (a che punta il link)rename cambia nome ad un file; C callable routinerev scrive al contrario le linee di un filesize scrive la grandezza di un object filesort ordina o fa il merge di filessplit spezza files in piu’ pezzistat, lstat, fstat ottiene informazioni sullo stato di un file ; C callable routinestrncpy, strlen, undex, rindex operazioni con le stringhe di bytes ; C callable routinestrings conversione e copia di un filesum somma e conta i blocchi in un fileswab fa lo scambio di bits ; C callable routinesymlink crea crea symbolic links ad un file ; C callable routinetar tape archivertr character translatortouch crea un file vuoto od updata la data dell’ultima modifica di un filetroff formattamento di un testo
98*
TABELLA DEI COMANDI O ROUTINES PER IL MANAGEMENT DI FILES E DIRECTORIES
Manipulation commands riguardanti files (V)
nome comando significato
truncate, ftruncate tronca un file ad una lunghezza prefissata ; C callable routinetsort ordinamento topologicoumask definisce le protezioni di default per i files creatiuniq riporta e/o cancella le linee che si ripetono in un fileutime assegna la data di accesso e di modifica ad un file ; C callable routineutimes assegna la data di accesso e di modifica ad un file ; C callable routinewc conteggio delle parole in un filewhat mostra che versioni di objects sono state usate per costruire un filewhich trova il file corrispondente ad un comando, incluso alias e path
99*
Il comando ls viene usato per elencare files, directories e loro caratteristiche.
Sintassi ls [-options] [arguments]
Negli esempi che seguono, supponiamo di essere in una directory che contiene 4 files :
myfile.txt , program.f , .login (hidden file) e tmp (una directory). Quest’ultima a sua
volta, contenga un file di nome test .
lsmyfile.txt program.f tmpls -a.login myfile.txt program.f tmpls -Rmyfile.txt program.f tmp
tmp:testnell’ultimo esempio, la lista include non solo il contenuto della current directory (esclusi glihidden files) ma anche tutti i files di tutte le sottodirectories piu’ basse nella gerarchia delledirectories.
Elenco del contenuto di una directory ( Elenco del contenuto di una directory ( lsls ) )
100*
ls ltotal 1-rwxr-xr-x 1 user1 GR1 1024 24 Aug 13:40 myfile-rwxrwx--x 1 user1 GR1 512 10 Jul 21:10 program.fdrwxr-xr-x 2 user1 GR1 30 12 Sep 04:10 tmpil comando ls l fa il long listing dando informazioni addizionali sul tipo di file (vedi dopo la sezione sulle caratteristiche di un file)
ls questo comando fa la lista della current directory piu’ dei files contenuti nelle directoriesUN livello piu’ in basso. In modo analogo, ls fa la lista dei files nella current directorye nelle directories UNO e DUE livelli piu’ in basso.ls -Fmyfile.txt program.f tmp/questo comando indica anche il tipo di file : e’ un file che ha la protezione x (puo’ essereeseguito) , / indica che e’ una directory, @ significa un symbolic link mentre = significache e’ un socket .ls -1myfile.txtprogram.ftmp
101*
ls -Cquesto comando forza il formato a multicolonne (che e’ comunque il default)
ls tquesto comando elenca i files in ordine temporale tenendo conto della data di ultima modifica ( i files piu’ recenti vengono elencati prima )
ls relenca i files in ordine alfabetico inverso
ls rtelenca i files in ordine temporale inverso
Ordine seguito nel produrre le listeA meno che non venga modificato da un’opzione, l’ordinamento dei files elencati e’ :1) files che cominciano con un punto2) files che cominciano con un numero3) le maiuscole4) le minuscoleEsempio :ls a.123 .Test .test 123 Prova prova
102*
Le opzioni di ls possono essere combinate tra loro, ad es.ls a l ( equivalente a ls al ) produce una long list di tutti i files, anche gli hidden.
Si consideri il seguente esempio :ls l-rwxr--r-- danny staff 1000 10 Aug 12:20 testfilequesto e’ un full listing delle caratteristiche, che ora esamineremo, del file testfile
) Il primo carattere e’ la descrizione del tipo di file :d directory fileb block-type special filec character-type special filel symbolic links socket- file normale (ASCII o binario)
2) I 9 caratteri seguenti ( rwxr--r-- ) definiscono le protezioni del file per l’utente, il gruppo, tutti gli altri. In Unix e’ sottinteso che il system manager abbia tutti i privilegi.Protezione r significa possibilita’ di leggere il file, w di scrivere o cancellare, x di eseguire.
Combinazioni di piu’ opzioniCombinazioni di piu’ opzioni
Caratteristiche dei filesCaratteristiche dei files
103*
3) Il secondo campo nell’esempio, indica il numero di links che il file possiede ( 1 ) ; un file ha sempre almenolink alla directory alla quale appartiene ; una directory ha sempre almeno 2 links, uno alla directory della quale e’ sottodirectory, un altro ai files contenuti in essa. Altri links possono essere definiti col comando ln4) il terzo campo e’ l’owner del file5) il quarto campo e’ il gruppo al quale l’owner appartiene ( e di conseguenza anche il file )6) segue poi la grandezza del file espressa in bytes7) seguono quindi data di ultima modifica del file ( eventualmente data di creazione del file ) ed ora8) nell’ultimo campo c’e’ il nome del file.
104*
Questo comando assegna il tipo di protezioni od accessi di default per la current shell,per tutti i files creati susseguentemente.Sintassi : umask [opzione] [value]Senza argomenti, mostra la file creation mask di default. Con l’argomento value la assegna.Mask e’ data come valore ottale.Bisogna tenere presente che la mask effettiva assegnata ad un nuovo file e’
mode & value dove mode e’ una maschera aggiuntiva data dal sistema, di solito 666
umask 022
assegna accesso 666 & 022 = 644 vale a dire r , w per user
e r access per group ed other ( tutti gli altri utenti ).
ComandoComando umaskumask
105*
pwd
/home/boca/dimostrazione
cd ../cestino la nuova directory e’ /home/boca/cestino
cd /home/boca la nuova directory e’ /home/boca
cd senza argomenti, indica la home directory. Dopo questo
comando, la directory e’ /home/boca
Current directoryIl comando che mostra la current directory e’ pwd
pwd/home/boca
Cambio di directory
Sintassi : cd directory oppure chdir directory
dove directory puo’ essere sia un relative directory path che un absolute directory path
Current directory, cambio di directoryCurrent directory, cambio di directory
106*
La C-shell estende l’uso di cd per mezzo della shell variable cdpath ; infatti se
directory non e’ un sottodirettorio del current directory, e non incomincia per / , ./
oppure ../ , allora ciascun componente della shell variable cdpath viene controllato
per vedere se ha come sottodirectory directory e se si’ tale sottodirectory diventa la
current directory.
Infine se anche questo fallisce, la C-shell controlla se directory non sia una shell variable il
cui nome incomincia per / , ed in tal caso fa diventare tale nome la current directory (se
esiste).
set cdpath = /usr/testpwd /programs/newcd temppwd/user/test/tempset cdpath = (/usr/doc /user/com)
107*
E’ una lista di directories definito dalla C-shell solo per la sessione corrente.
La current directory e’ sempre in cima alla lista. L’utente puo’ costruire ed utilizzare il
directory stack coi comandi pushd , popd , dirs
Sintassi : pushd directoryname
Azione : mette in cima al directory stack la directory directoryname e fa
diventare directoryname la current directory
Sintassi : dirs
Azione : mostra il directory stack
Sintassi : pushd +n
Azione : ruota lo stack n volte
Sintassi : popd
Azione : elimina il current directory dalla cima della stack, lasciando invariati
gli altri ; fa diventare il prossimo directory dello stack il current
directory
Directory stackDirectory stack
108*
pwd
/user2/programs/new
pushd /usr
/usr /user2/programs/new
pwd
/usr
dirs
/usr /user2/programs/new
pushd /etc
/etc /usr /user2/programs/new
pushd +
/usr /user2/programs/new /etc
pwd
/usr
popd
/user2/programs/new /etc
109*
Per ultimo si noti che il comando cd ( o chdir ) ha l’effetto sul directory stack di
cambiare solo la directory in cima nel current directory, lasciando le altre directories della
lista invariate
dirs
/user2/programs/new /etc
cd /tmp
dirs
/tmp /etc
110*
Sintassi : mkdir [opzioni] directoryname
Azione : crea la nuova directory directoryname . Quest’ultimo puo’ essere sia un
pathname relativo ( alla current directory ) sia un pathname assoluto.
pwd
/user2/programs/new
mkdir tmp pathname relativo
ls
/user2/programs/new/tmp
pwd
/user2/programs/new
mkdir /user2/programs/new/test pathname assoluto
ls
/user2/programs/new/tmp /user2/programs/new/test
Creazione di directoriesCreazione di directories
111*
ls
file file2 pippo prova tmp.f
rm file
rm i p
rm : remove pippo ?
rm : remove prova ?
In questo esempio l’uso dell’opzione i fa apparire il messaggio di conferma
al quale l’utente deve rispondere con un yes o y
Sintassi : rm [opzioni] nomefile
Azione : rimuove nomefile ( dove quest’ultimo puo’ essere un pathname
assoluto o relativo )
Opzioni : i r
l’opzione i fa si’ che prima di rimuovere il file un messaggio appaia a terminale per
chiedere conferma di voler cancellare il file l’opzione r rimuove una directory con
tutto il suo contenuto ( incluse eventuali altre directories con i loro contenuti )
Rimozione di files e directoriesRimozione di files e directories
112*
ls l
-r--r--r-- boca GR1 189 May 18 22;56 prova.f
rm prova.f
rm : override protection 444 for prova.f ?
Il file prova.f ha permission di read only e quindi non viene cancellato. Il sistema
chiede esplicitamente all’utente se vuole rimuovere il file , lo user deve rispondere con yes
o y per poter cancellare il file effettivamente.
NOTA BENE NOTA BENE Per poter rimuovere un file occorre che esso abbia la permission di tipo w (write e
delete permission). Inoltre se la directory contenente il file non ha write
access da parte dell’ owner allora compare il messaggio : Permission denied ed il
comando non viene eseguito.
113*
ls l
-r--r-xr-x boca GR1 189 May 18 22:56 prova.f
drwxr--r-- boca GR1 512 May 19 13:14 cestino
rm r cestino
Questo comando rimuove la directory cestino e tutto il suo contenuto
114*
ls 1
file1
file2
cp i file1 file2
overwrite file2 ?
Sintassi : cp [opzioni] file1 file2
Azione : copia file1 su file2 . Se file2 esiste gia’, la vecchia versione viene
sovrascritta
Opzioni : i r
L’opzione i fa si’ che qualora file2 esista gia’, venga richiesta all’utente conferma prima
di copiare. L’opzione r serve per copiare directory intere ( con tutto il loro contenuto ).
Copia di files e directoriesCopia di files e directories
115*
ls R lista recursiva del contenuto della current directory
pippo pluto user1 user2
./user: user e’ a sua volta una directory
program.f dati.dat
./user2: user2 e’ a sua volta una directory
campo.FOR prog.c
cp r user1 user2 copia la directory user1 in user2
ls R
pippo pluto user1 user2
./user1:
program.f dati.dat
./user2:
campo.FOR prog.c user1 in user2 c’e’ anche user1 con tutto il suo contenuto
./user2/user1:
program.f dati.dat
116*
Sintassi : mv [opzioni] file1 file2
Azione : muove files da una directory ad un’altra ovvero cambia nome a files e
directories
Opzioni : i f --
L’opzione -i , come gia’ visto per il comando cp , fa si’ che qualora file2 esista gia’, venga
richiesta all’utente conferma prima di sovrascriverlo.
L’opzione -f al contrario, forza la sovrascrittura di file2 qualora esista gia’, cancellando
l’effetto di un’eventuale opzione -i precedentamente definita ( con un alias ad es. )
L’opzione -- fa si’ che tutti gli argomenti del mv che seguono vengano interpretati
come filenames. Questo permette ai filenames di cominciare con un -
Cambiare nome ad un fileCambiare nome ad un file
117*
ls
file1 file2
mv -i file1 file2
overwrite file2 ? y
ls
file2
ls
file1 file2
mv -- file1 -pinco l’opzione -- permette di dare a file un nome che comincia
con -
ls
file2 -pinco
118*
I comandi piu’ usati per mostrare il contenuto di un file sono : cat , more ( o page ) ,
head , tail , pr , od
Comando cat
Sintassi : cat [opzioni] filename(s)
Azione : stampa a terminale il contenuto del file filename(s) facendo
automaticamente lo scroll del terminale.
Opzioni : -n
L’opzione -n fa il display del file numerando ciascuna linea in modo progressivo.
Display di un fileDisplay di un file
119*
Comando more ( o page )
I comandi more e page sono equivalenti.
Sintassi : more [opzioni] filename(s)
Azioni : mostra il contenuto del file filename(s) una pagina alla volta, per
default sono 2 linee in meno (22) di quante ne puo’ mostrare il terminale
Opzioni : tra le molte opzioni, citiamo solo -number che fa il display con number
linee, e +number che comincia il display a partire dalla linea number.
Questi comandi mostrano una pagina alla volta, indicano la percentuale di file gia’ mostrata
ed attendono il responso dell’utente. Battendo <cr> verra’ mostrata una linea in piu’,
mentre battendo la barra dello spazio, viene mostrata la nuova paginata.
NOTA BENE NOTA BENE Questi comandi hanno alcune delle possibilita’ dell’editor vi , come ad es. la possibilita’ di
andare avanti con f e tornare indietro con b , quella di pattern matching etc.
assomigliando quindi molto ad un line editor read only. Per avere l’elenco completo di
queste possibilita’ basta battere h dopo aver attivato il comando more .
120*
Comando head
Sintassi : head [opzioni] file(s)
Azione : fa il display della prima parte di file(s)
Opzioni : -number che fa il display delle prime number linee. Per default
vengono mostrate le prime 10 linee
Comando tail
Sintassi : tail [opzioni] file(s)
Azione : fa il display dell’ultima parte di file(s)
Opzioni : -number che fa il display delle ultime number linee. Per default
vengono mostrate le ultime 10 linee
121*
cat file
linea1
linea2
linea3
linea4
head -3 file | tail -1
linea3
122*
Comando pr
Sintassi : pr [opzioni] file(s)
Azione : stampa un file allo standard output, con vari formattamenti. Se il file da
stampare non viene specificato, o e’ un - , il comando prende input
da standard input.
Opzioni : citiamo solo le opzioni -number e -m
Senza opzioni, pr stampa file(s) a pagine di 66 linee ciascuna aggiungendo per ogni
pagina, nome del file stampato, data e numero di pagina, ed uno header ed un trailer di 5
righe vuote.
Con l’opzione -number file(s) viene stampato in number colonne.
Con l’opzione -m e nella forma pr -m file1 file2 vengono stampati file1 e file2 uno
accanto all’altro ( utile per fare confronti di files ). E’ da notare che per default pr tronca
le linee troppo lunghe.
123*
Comando od
Sintassi : od [opzioni] file(s)
Azione : stampa il contenuto ( dump ) a terminale di file(s) in formato ottale,
decimale, esadeciamale, ASCII
Opzioni : dipendono da macchina a macchina, per OSF1 citiamo -o -O -a -h
-H -i -I
L’opzione -o ( default ) stampa il file in short words ( parole da 16 bits ) stampando il
contenuto in ottale. L’opzione -O fa lo stesso, ma stampa il file in long words ( 32 bits ).
L’opzione -a stampa file(s) a bytes, e rappresentando ciascun byte col carattere ASCII
corrispondente. Le opzioni -h e -H stampano in esadecimale, il file suddiviso
rispettivamente in short e long words. Infine -i e -I stampano short e long words
interpretate come interi ( senza segno ).
124*
cat file
line1
od -a file
0000000 l i n e 1 nl
0000006
od -o file
0000000 064554 062556 005061
0000006
od -h file
0000006 696c 656e 0a31
la colonna piu’ a sinistra e’ un numeroottale che esprime il numero di bytesfinora stampati
125*
Come gia’ detto, ogni file e directory ha 3 tipi di protezioni od accessi ( r , w , x ) per 3 tipi
di utenti ( owner , group , all ) mentre il superuser ( system manager ) ha sempre tutti gli
accessi disponibili.
Il comando chmod permette
all’utente owner di un file o
directory di cambiare queste
protezioni , mentre umask
assegna le protezioni di default
per la current shell.
Sintassi :
chmod [opzioni] mode file(s)
Il livello di protezione (mode)
puo’ essere dato in 2 modi, in
forma assoluta od in forma
simbolica.
user group world ( other )
rwx rwx rwx
da cui
7 = 4 + 2 + read, write , execute access
6 = 4 + 2 read, write
5 = 4 + read, execute
4 = 4 read only
3 = 2 + write , execute
2 = 2 write only
= execute only
Cambio di protezione di files e directoriesCambio di protezione di files e directories
126*
ls -l a.dat
-r-x------ 1 boca GR1 1954 May 3 18:31 a.dat
chmod 755 a.dat forma assoluta, codice ottale
ls -l a.dat
-rwxr-xr-x 1 boca GR1 1954 May 3 18:31 a.dat
chmod u-w,g+w,o=r a.dat forma simbolica
ls -l a.dat
-r-xrwxr-- 1 boca GR1 1954 May 3 18:31 a.dat
chmod a=rx a.dat
ls -l a.dat
-r-xr-xr-x 1 boca GR1 1954 May 3 18:31 a.dat
127*
Il comando chgrp cambia la proprieta’ di gruppo ( lo user titolare del file rimane lo stesso)
di files e directories. Per applicare questo comando, chi lo fa deve essere il proprietario del
file e deve appartenere al gruppo che riceve la proprieta’ del file.
Sintassi : chgrp [opzioni] newgroup file
groups ; ls -lg file
admin projecta
-rw-rw-r-- 2 system projecta 1594 Feb 20 13:55 file
chgrp admin file ; ls -lg file
-rw-rw-r-- 2 system admin 1594 Feb 20 13:55 file
Cambio di proprieta’ di gruppo di files e directoriesCambio di proprieta’ di gruppo di files e directories
128*
In Unix si possono usare i comandi cmp e diff per stampare a terminale le differenze che
esistono tra due files.
Il comando cmp riporta solo la prima differenza trovata, e funziona anche con files non
ASCII. Il comando diff riporta tutte le differenze tra due ASCII files.
Sintassi : cmp [opzioni] file1 file2
diff [opzioni] file1 file2
pr -m file1 file2
Maine Texas
Montana Montana
Nebraska Illinois
Illinois Alabama
Iowa Maine
cmp file1 file2
file1 file2 differ: char 1 line 1
Confronto tra filesConfronto tra files
129*
si considerino gli stessi files precedenti.
diff file1 file2
1c1
<Maine
---
>Texas
3d2
<Nebraska
5c4,5
<Iowa
---
>Alabama
>Maine
130*
Il significato delle linee di output e’ il seguente :
linea 1 : consiste di 3 campi
a) n. della linea o range dei n. delle linee nel primo file, prima del cambiamento
b) un carattere che descrive il tipo di cambiamento : a =append, c=change , d=delete
c) il n. della linea od il range dei n. delle linee dopo il cambiamento
linea 2 : le linea ( linee ) dal primo file, nel caso sia appropriato, identificate con <
linea 3 : se necessario, il delimitatore --- tra gli items del primo e del secondo file
linea 4 : se necessario, le linee del secondo file, identificate con >
Nell’ esempio quindi, il significato dell’output e’ : cambiare Maine in Texas in file1 , la
linea n. 1 rimane la linea n. 1. Cancellare la linea n. 3 ( Nebraska ) dal file1 cosi’ che
la linea 3 diventa la linea 2. Cambiare la linea 5 in file1 da Iowa in due nuove linee,
Alabama e Maine, cosi’ che la linea 5 diventa linea 4 e linea 5.
diff -e file1 file2
L’opzione -e produce in output i comandi da dare all’editor ed per far diventare
file1 identico a file2
131*
diff -r dir1 dir2
L’opzione -r permette confronti fra le directories dir1 e dir2 , riportando o
l’esistenza di un file in una sola delle directories o le differenze tra files che hanno lo
stesso nome ; questo tipo di confronto viene ripetuto per tutte le sottodirectories di dir1 e
dir2 .
132*
Si usa il comando find per cercare un file che si trova in una certa directory od in
una sua qualunque sottodirectory che si trovi piu’ in basso nella gerarchia delle directories.
Questo comando offre piu’ funzionalita’ di ls R visto in precedenza.
Con find si possono usare vari criteri per localizzare il file(s), si possono manipolare il file(s)
trovati oppure eseguire comandi se si e’ localizzato il file(s). Le ampie funzionalita’ di find
richiedono pero’ una sintassi piu’ complicata dei comandi fin qui visti ; tra l’altro le varie
opzioni devono venir date nel seguente ordine ( a differenza della maggioranza degli altri
comandi della C-shell )
Sintassi : find pathname criterion action
pathname : directory di partenza da cui iniziare la ricerca
criterion : criterio da usare nella ricerca del file(s) ad es. il nome del file(s)
action : quello che il sistema deve fare una volta trovato il file(s)
find / -name ourfile -print
/user1/bin/ourfile
/user3/progs/ourfile
Ricerca di filesRicerca di files
133*
find / -name myfile -exec file {} \;
/user1/bin/myfile: executable
/usr/local/myfile: directory
/etc/myfile: empty
/user3/myfile: ascii text
/user4/data/myfile: data
/user5/scripts/myfile: commands text
trova a partire da / i files di nome myfile e per ognuno di essi esegue il comando file .
Si noti l’uso delle parentesi { } e di \; obbligatorio quando si usa l’opzione -exec .
find /user1 -mtime +45 -print trova i files con modification time maggiore di
45 giorni e stampali a terminale. Da notare che qui modificato significa scritto.
find /user1 -name ‘*.f’ -atime -45 -print trova i files che terminano con
.f e che hanno access time ( cioe’ l’ultima volta che sono stati letti ) minore di 45 giorni.
find /usr -name ‘*.f’ \( -mtime -3 -o -atime -6 \) -exec rm {} \;
trova, a partire da /usr i files che terminano con .f scritti da meno di 3 giorni
OPPURE ( OR logico, opzione -o ) letti da meno di 6 giorni, e cancellali ( -exec rm {} )
134*
Il comando grep cerca una determinata stringa di caratteri in uno o piu’ files.
Sintassi : grep [option(s)] pattern file(s)
cat file
George says :
hey, hello there, what a nice day!
And Ann answers : who cares ?
grep ‘hello there’ file
hey, hello there, what a nice day!
grep -i ‘HELLO there’ file.txt -i : ricerca case insensitive
file1.txt: hey, hello there, what a nice day!
file2 txt: hey, hello there, what a horrible day!
grep -n Goodbye file3 -n : n. della linea(e) che ha la stringa cercata
12:Goodbye and have a nice day!
grep -c Goodbye file3 -c : n. di linee che hanno la stringa cercata
1
Ricerca del contenuto di filesRicerca del contenuto di files
135*
grep -v hey file -v : display delle linee che NON corrispondono
George says :
And Ann answers : who cares ?
grep -l hey fil* -l : mostra solo il nome del file (1 volta sola) nel
file quale una o piu’ corrispondenze sono state trovate
grep -e hello -e George file -e : opzione che serve per cercare
George says : uno o piu’ patterns
hey, hello there, what a nice day!
Per cercare uno o piu’ patterns e’
possibile usare l’opzione -f ed un file
di testo. In tal caso ciascuna linea del
testo diventa la stringa di caratteri con
cui fare il confronto.
cat match
hello
George
grep -f match file
George says :
hey, hello there, what a nice day!
136*
grep mode$ file ricerca del pattern mode posto alla fine della linea
grep ^the file ricerca del pattern the posto all’inizio di una linea
ls -l | grep ^d ricerca delle sottodirectories contenute nella
current directory
Con grep e’ possibile usare le cosiddette regular expressions che sono stringhe composte di
normali caratteri e metacaratteri, che sono un potente mezzo per specificare i patterns con
cui cercare in un file. Le regole per formare regular expressions sono molto articolate, si
possono trovare ad es. con man grep , qui daremo solo un paio di esempi.
137*
cat file1
aaaaa
123
Abbb
zzzzzz
sort file1 sorting nello stesso ordine usato da ls
123 l’output e’ lo standard output
Abbb
aaaaa
zzzzzz
In Unix viene usato il comando sort per ordinare ( sorting ) alfabeticamente un file di testo
e/o per congiungere ( merging ) piu’ files in un unico file.
Sintassi : sort [option(s)] [+pos1] [-pos2] file(s)
Sort e merge di filesSort e merge di files
138*
cat file2
Boca
gianluigi
sort file1 file2 ordina file1 e file2, considerandoli come un unico file,
123 e produce un unico output ( merging ) che va a stdout
Abbb
Boca
aaaaa
gianluigi
zzzzzz
139*
sort -o out file1 output va al file out (uguale a sort file1 > out )
sort -f file1 file2 non fa distinzione tra maiuscole e minuscole
123 al momento del sorting
aaaaa
Abbb
Boca
gianluigi
zzzzzz
cat prova
sedd 123 456 abc
ase 19 25 cccc xdrf
aaa 343 20 arrt eee
sort -k 4,6 prova sceglie il sort key field il quarto campo e, nel
sedd 123 456 abc caso di uguaglianza, il 5o ed il 6o. Se sono ancora uguali, si considera
aaa 343 20 arrt eee tutta la riga. I campi vengono definiti dal delimitatore di
ase 19 25 cccc xdrf default che e’ il blank ; un campo (in assenza dell’opzione
-t ) e’ definito come una sequenza massimale di non-blanks piu’ tutti i blanks che precedono
140*
sort -k 2n,2n prova il sort key field e’ il secondo campo, e’
ase 19 25 cccc xdrf numerico e l’ordinamento considera l’intero
sedd 123 456 abc numero che c’e’ nella sort key ( opzione n )
aaa 343 20 arrt eee
cat prova
sedd:123:456:abc
ase:19:25:cccc:xdrf
aaa:343:20:arrt:eee
sort -t: -k 2n,2n prova come il sort precedente, ma i campi ora
ase:19:25:cccc:xdrf sono delimitati da : (opzione -t ); inoltre
sedd:123:456:abc con questa opzione ogni delimitatore diventa
aaa:343:20:arrt:eee significativo nel senso che due delimitatori
consecutivi definiscono un campo vuoto.
141*
cat prova
sedd:123:456:abc
sedd:123:46:abc
ase:19:25:cccc:xdrf
aaa:343:20:arrt:eee
sort -t: -k 2n,2n -k 3n,3n prova esempio di multifield sort key.
ase:19:25:cccc:xdrf Prima il confronto avviene con il sort key field
sedd:123:46:abc n. 2, in caso di uguaglianza si passa al prossimo
sedd:123:456:abc sort key field, che e’ il n. 3 ; entrambi sono
aaa:343:20:arrt:eee numerici. Il delimitatore e’ :
sort -t: +1n -3 prova esempio di sort field dato con +
ase:19:25:cccc:xdrf Il confronto avviene con il sort key field n. numerico (n)
sedd:123:46:abc e termina col campo 2 (che viene prima del campo 3). Si
sedd:123:456:abc noti che con questa opzione i campi si contano a partire da
aaa:343:20:arrt:eee 0.
142*
ls -l a.out
-rwxr-xr-x 1 boca GR1 24576 May 2 17:29 a.out
ultima modification time
touch a.out
ls -l a.out
-rwxr-xr-x 1 boca GR1 24576 May 25 19:01 a.out
nuova modification time
Il comando touch aggiorna la modification date di un file ( data dell’ultima volta in cui il
file fu scritto ) se esiste gia’, oppure crea un file vuoto se esso non esisteva ancora.
Sintassi : touch [option(s)] file
Creazione od updating di un file : comandoCreazione od updating di un file : comando touchtouch
143*
ls
a.out b.out prova.f
touch pippo ; ls
a.out b.out pippo prova.f crea il file ( vuoto ) pippo
ls
a.out b.out prova.f
touch -c pippo ; ls l’opzione -c impedisce la creazione del file
a.out b.out prova.f pippo
144*
Il comando tr copia caratteri dallo stdin allo stdout con sostituzione o cancellazione dei
caratteri selezionati dall’utente.
Sintassi : tr [option(s)] char1 char2
char1 e’ il carattere che viene sostituito con char2
tr A a < file1 > file2
trasforma tutte le A maiuscole presenti in file1 in a minuscole, e mette l’output
in file2.
tr A-Z a-z < file1 > file2
trasforma tutte le maiuscole presenti in file1 in minuscole, e mette l’output in file2.
tr -d A < file1 > file2
cancella tutte le A maiuscole presenti in file1 e mette l’output in file2.
Character translatorCharacter translator
145*
Il comando wc conta il numero di linee, parole, caratteri ( o bytes ) presenti in uno o piu’
file di testo ASCII e li scrive allo stdout. Nel caso di piu’ files in input ne stampa anche il
totale.
Sintassi : wc [option(s)] file(s)
cat testo
sedd 123 456 abc
ase 19 25 accc xdrf
aaa 343 20 arrt eee
wc testo
3 14 57 testo
wc prov*
12 21 189 prova.f
4 7 47 prova1.f
16 28 236 total
Word countingWord counting
146*
Un link e’ un nome diverso dato ad un file gia’ esistente. Un link non e’ una copia
separata dello stesso file, ma solo una directory entry in piu’ che conduce allo stesso file.
Dato che un file puo’ avere multipli links, puo’ succedere che users diversi leggano o
scrivano contemporaneamente lo stesso file e si possono percio’ avere problemi di
corruzione di files.
Ci sono due tipi di links : un hard link ( default ) ed uno soft o symbolic link. Lo hard link
crea una nuova directory entry per il medesimo file ( senza duplicarlo fisicamente ) cosi’ che
lo stesso file fisico e’ accessibile con due ( o piu’ ) nomi diversi. Se l’utente cancellasse il file
originario ( nome vecchio ) il file sarebbe accessibile allo stesso modo col nome nuovo e
finche’ anche il nome nuovo non e’ cancellato, il file non scompare dalla memoria.
Quando l’utente crea uno hard link il link count aumenta di uno, ma l’ inode del file e’
identico a quello vecchio. Uno hard link non puo’ abbracciare filesystems diversi.
Link tra filesLink tra files
147*
Un symbolic link invece e’ solo un file che contiene il path per il file originale. Se il file
originario fosse cancellato, il link continuerebbe ad esistere, ma non ci sarebbe piu’ modo di
accedere all’informazione del file originario. Un link simbolico non incrementa il link count.
Un link simbolico puo’ abbracciare filesystems diversi.
148*
Sintassi : ln [option(s)] name1 name2
dove name1 e’ il nome del file che esiste gia’ mentre name2 e’ il nome del nuovo file, link
del vecchio.
ls -li
1035465 -rw rw r-- 1 system 2046 Feb 25 13:58 file1.dat
ln file1.dat foo hard link
ls -il
1035465 -rw rw r-- 2 system 2046 Feb 25 13:58 file1.dat
1035465 -rw rw r-- 2 system 2046 Feb 25 13:58 foo
ls -li
1035465 -rw rw r-- 1 system 2046 Feb 25 13:58 file
ln -s file foo link simbolico
ls -il
1035465 -rw rw r-- 1 system 2046 Feb 25 13:58 file
1024567 lrw rw r-- 1 system 2046 Feb 25 13:58 foo -> file
149*
submits a schedule ofcommands to cron
display and update informationabout the top cpu processes
shows current process status
QQuesto capitolo tratta di quei comandi che permettono di :uesto capitolo tratta di quei comandi che permettono di :
monitorare gli users ed i loro processmonitorare gli users ed i loro processmonitorare gli users ed i loro processmonitorare gli users ed i loro process
whoamiusers (u)whowrwhopstopdulimit
whoamiusers (u)whowrwhopstopdulimit
monitorare il sistemamonitorare il sistemamonitorare il sistemamonitorare il sistema
modifica dei processmodifica dei processmodifica dei processmodifica dei process
displays the users’s name
displays a list of users who are on the system
identifies users currently logged in
summary of current system activities
shows users logged in to hosts on the local network
lists the system resources available to useror reduces resources limits of a process
displays a summary of disk usage
displays virtual memory statisticsdisplays statistics on free disk space
vmstatdf
vmstatdf
alters priority to running processes
lowers priority to a process to be executed
runs commands at a later timesend a signal to a process kill
atcrontabnicerenice
killatcrontabnicerenice
150*
7.1 Monitorare gli users ed i loro process7.1 Monitorare gli users ed i loro process7.1 Monitorare gli users ed i loro process7.1 Monitorare gli users ed i loro process
Esaminiamo ora quei comandi che permettono di sapere quanti e quali utenti sonocollegati al sistema, quali process hanno ‘lanciato’, quanto spazio su disco e’ ancoradisponibile, quali sono i limiti di utilizzo delle risorse del computer imposti ad un certoutente.
Esaminiamo ora quei comandi che permettono di sapere quanti e quali utenti sonocollegati al sistema, quali process hanno ‘lanciato’, quanto spazio su disco e’ ancoradisponibile, quali sono i limiti di utilizzo delle risorse del computer imposti ad un certoutente.
Sintassi : whoami
Azione : mostra lo username associato
con la sessione corrente.
Sintassi : whoami
Azione : mostra lo username associato
con la sessione corrente.
Comando Comando whoamiwhoamiComando Comando whoamiwhoami
Serve per esempio quando si utilizzano piu’ sessioni contemporaneamente se ci sidimentica con quale username abbiamo aperto la sessione.
Serve per esempio quando si utilizzano piu’ sessioni contemporaneamente se ci sidimentica con quale username abbiamo aperto la sessione.
151*
Sintassi : users (oppure u )
Azione : stampa a terminale l’elenco alfabetico degli usernames degli utenti
interattivi che sono correntemente collegati
Sintassi : users (oppure u )
Azione : stampa a terminale l’elenco alfabetico degli usernames degli utenti
interattivi che sono correntemente collegati
Comandi Comandi users ( u )users ( u ),, who who,, w w ee rwho rwhoComandi Comandi users ( u )users ( u ),, who who,, w w ee rwho rwho
usernames degli utenti correntemente collegati in interattivousernames degli utenti correntemente collegati in interattivo
Questi comandi forniscono informazioni, via via con maggiore dettaglio, sugli utenticorrentemente collegati in modo interattivo.
Questi comandi forniscono informazioni, via via con maggiore dettaglio, sugli utenticorrentemente collegati in modo interattivo.
152*
Sintassi : who
Azione : stampa a terminale l’elenco degli usernames degli utenti
interattivi che sono correntemente collegati, il nome del device al
quale il terminale dell’utente e’ collegato, e l’ora del login.
Sintassi : who
Azione : stampa a terminale l’elenco degli usernames degli utenti
interattivi che sono correntemente collegati, il nome del device al
quale il terminale dell’utente e’ collegato, e l’ora del login.
login timelogin timedevicedevice
usernameusername
153*
Sintassi : w [option(s)] [username]
Azione : stampa a terminale una linea di header con l’ora corrente, da quanto
tempo il computer e’ attivo, il numero di utenti, ed il load average, vale a dire il numero
di jobs nella run queue negli ultimi 5 secondi, 30 secondi o 60 secondi. Di ciascun utente
(se username manca) od eventualmente solo dell’utente username viene mostrato :
username, device, da quale computer e’ stato fatto il login, ora del login, da quanto tempo
l’utente e’ rimasto idle, il CPU time accumulato da tutti i process dell’utente dal momento
del login (JCPU) in minuti, il CPU time (in minuti) usato da(i) process(es) attivi
correntemente (PCPU), il nome del programma eseguito dal current process.
Sintassi : w [option(s)] [username]
Azione : stampa a terminale una linea di header con l’ora corrente, da quanto
tempo il computer e’ attivo, il numero di utenti, ed il load average, vale a dire il numero
di jobs nella run queue negli ultimi 5 secondi, 30 secondi o 60 secondi. Di ciascun utente
(se username manca) od eventualmente solo dell’utente username viene mostrato :
username, device, da quale computer e’ stato fatto il login, ora del login, da quanto tempo
l’utente e’ rimasto idle, il CPU time accumulato da tutti i process dell’utente dal momento
del login (JCPU) in minuti, il CPU time (in minuti) usato da(i) process(es) attivi
correntemente (PCPU), il nome del programma eseguito dal current process.
154*
Sintassi : w [option(s)] [username]
Azione : stampa a terminale una linea di header con l’ora corrente, da quanto
tempo il computer e’ attivo, il numero di utenti, ed il load average, vale a dire il numero
di jobs nella run queue negli ultimi 5 secondi, 30 secondi o 60 secondi. Di ciascun utente
(se username manca) od eventualmente solo dell’utente username viene mostrato :
username, device, da quale computer e’ stato fatto il login, ora del login, da quanto tempo
l’utente e’ rimasto idle, il CPU time accumulato da tutti i process dell’utente dal momento
del login (JCPU) in minuti, il CPU time (in minuti) usato da(i) process(es) attivi
correntemente (PCPU), il nome del programma eseguito dal current process.
Sintassi : w [option(s)] [username]
Azione : stampa a terminale una linea di header con l’ora corrente, da quanto
tempo il computer e’ attivo, il numero di utenti, ed il load average, vale a dire il numero
di jobs nella run queue negli ultimi 5 secondi, 30 secondi o 60 secondi. Di ciascun utente
(se username manca) od eventualmente solo dell’utente username viene mostrato :
username, device, da quale computer e’ stato fatto il login, ora del login, da quanto tempo
l’utente e’ rimasto idle, il CPU time accumulato da tutti i process dell’utente dal momento
del login (JCPU) in minuti, il CPU time (in minuti) usato da(i) process(es) attivi
correntemente (PCPU), il nome del programma eseguito dal current process.
155*
Sintassi : rwho [-a] [username]
Azione : comando che fornisce informazioni analogomente al comando who,
ma anche per users collegati su computers remoti facenti parte del
network locale. Se username viene specificato, solo su di esso
vengono date informazioni
Opzioni : -a per elencare tutti gli utenti sui computer remoti; altrimenti
sono segnalati solo quelli che hanno toccato la tastiera nell’ultima ora.
Sintassi : rwho [-a] [username]
Azione : comando che fornisce informazioni analogomente al comando who,
ma anche per users collegati su computers remoti facenti parte del
network locale. Se username viene specificato, solo su di esso
vengono date informazioni
Opzioni : -a per elencare tutti gli utenti sui computer remoti; altrimenti
sono segnalati solo quelli che hanno toccato la tastiera nell’ultima ora.
login timelogin timedevicedeviceusernameusername hostnamehostname idle time (in minuti)idle time (in minuti)
156*
Sintassi : ps [option(s)]
Azione : stampa a terminale un elenco di risorse usate da uno o piu’ process
Opzioni : ci sono molte opzioni, molte sono machine-dependent; qui di seguito
sono esemplificate le principali, valide per Linux. Per maggior dettagli : man ps
Sintassi : ps [option(s)]
Azione : stampa a terminale un elenco di risorse usate da uno o piu’ process
Opzioni : ci sono molte opzioni, molte sono machine-dependent; qui di seguito
sono esemplificate le principali, valide per Linux. Per maggior dettagli : man ps
Comando Comando pspsComando Comando psps
Questo comando (process status) mostra le risorse del sistema che vengono ‘consumate’da uno o piu’ process.
Questo comando (process status) mostra le risorse del sistema che vengono ‘consumate’da uno o piu’ process.
comando impartitocomando impartito
CPU time usatodal process
CPU time usatodal process
process ID numberprocess ID number
terminale da cui e’stato lanciato il
process
terminale da cui e’stato lanciato il
process
157*
Sintassi : ps l
Azione : come ps ma con maggiori dettagli (long list)
Sintassi : ps l
Azione : come ps ma con maggiori dettagli (long list)
parent process ID numberparent process ID number priorità (valori piu’ alti = minore priorita’)priorità (valori piu’ alti = minore priorita’)
% CPU used% CPU used
address of the name of the kernel functionthe task currently is sleeping in
address of the name of the kernel functionthe task currently is sleeping in
nice value = process scheduling increment;(valori piu’ alti = minore priorita’)
nice value = process scheduling increment;(valori piu’ alti = minore priorita’)
user ID numberuser ID number
status of process : R = running ; S = sleeping ; D = uninterruptible sleep (IO queues) Z = zombie (stoppato in modo non appropriato dal parent process) ; T = stopped ; W = swapped out ; C = negative nice values ; N = positive nice values
status of process : R = running ; S = sleeping ; D = uninterruptible sleep (IO queues) Z = zombie (stoppato in modo non appropriato dal parent process) ; T = stopped ; W = swapped out ; C = negative nice values ; N = positive nice values
158*
Sintassi : ps f
Azione : come ps ma con maggiori dettagli (full list)
Sintassi : ps f
Azione : come ps ma con maggiori dettagli (full list)
start time of the processstart time of the process
159*
Sintassi : ps v
Azione : come ps ma con maggiori dettagli; mostra lo stato della memoria
virtuale
Sintassi : ps v
Azione : come ps ma con maggiori dettagli; mostra lo stato della memoria
virtuale
status of processstatus of process total amount of physical memory used by the task in Kbytestotal amount of physical memory used by the task in Kbytes
percentage of physical memory used by the jobpercentage of physical memory used by the job
160*
Sintassi : ps u username
Azione : mostra informazioni su tutti i process appartenenti a username,
anche quelli che non sono stati lanciati dalla sessione corrente.
Sintassi : ps u username
Azione : mostra informazioni su tutti i process appartenenti a username,
anche quelli che non sono stati lanciati dalla sessione corrente.
job lanciato dalla sessione corrente ed attaccato al suo terminale
job lanciato dalla sessione corrente ed attaccato al suo terminale
job lanciato non dalla sessione correntee non ‘attaccato’ ad alcun terminale
job lanciato non dalla sessione correntee non ‘attaccato’ ad alcun terminale
161*
Sintassi : ps e
Azione : mostra informazioni su tutti i process presenti sul computer
Sintassi : ps e
Azione : mostra informazioni su tutti i process presenti sul computer
con ancheopzione f
con ancheopzione f
162*
Riassunto delle opzioni disponibil i con ps su LinuxRiassunto delle opzioni disponibil i con ps su Linux
163*
Sintassi : top [option(s)]
Azione : produce una schermata che viene rinfrescata di default ogni 5 secondi
con informazioni sui process maggiormente CPU-intensive.
Opzioni : [d delay specifica che il display venga rinfrescato ogni delay
secondi
[p ID viene mostrato solo il process con ID number ID
[q viene rinfrescato il display il piu’ velocemente possibile
[n num viene rifrescato il display num volte e poi top finisce.
Sintassi : top [option(s)]
Azione : produce una schermata che viene rinfrescata di default ogni 5 secondi
con informazioni sui process maggiormente CPU-intensive.
Opzioni : [d delay specifica che il display venga rinfrescato ogni delay
secondi
[p ID viene mostrato solo il process con ID number ID
[q viene rinfrescato il display il piu’ velocemente possibile
[n num viene rifrescato il display num volte e poi top finisce.
Comando Comando toptopComando Comando toptop
Questo comando mostra l’attivita’ del processore in real time. Mostra una lista dei jobsmaggiormente CPU-intensive del sistema e fornisce un’interfaccia interattiva permanipolare i process.
Questo comando mostra l’attivita’ del processore in real time. Mostra una lista dei jobsmaggiormente CPU-intensive del sistema e fornisce un’interfaccia interattiva permanipolare i process.
164*
size of the jobcode + data + stack, in Kbytes
size of the jobcode + data + stack, in Kbytes
numero e tipo di jobsnumero e tipo di jobs% CPU usata dagli utenti% CPU usata dagli utenti
% CPU usata dal sistema% CPU usata dal sistema % jobs con NICEnegativa
% jobs con NICEnegativa
% jobs idle% jobs idle
stato swapspace
stato swapspace
stato memoriadel sistema
stato memoriadel sistema
status, < for processes with negativenice, W for swapped processes (doesn’twork correctly for kernel processes)
status, < for processes with negativenice, W for swapped processes (doesn’twork correctly for kernel processes)
total shared memorytotal shared memorytotal physicalmemoryused by job,in Kbytes
total physicalmemoryused by job,in Kbytes
165*
Sintassi : du [option(s)] [file(s)] [directory(ies)]
Azione : segnala quanto spazio su disco e’ occupato dai files o directories
specificate (in unita’ di 1024 bytes Kbyte) e per ciascuna
subdirectory.
Opzioni : a se l’argomento e’ una directory mostra lo spazio occupato da
ciascun file, non solo dalla directory
s summary, fa vedere lo spazio occupato in totale da ciascun
argomento.
Sintassi : du [option(s)] [file(s)] [directory(ies)]
Azione : segnala quanto spazio su disco e’ occupato dai files o directories
specificate (in unita’ di 1024 bytes Kbyte) e per ciascuna
subdirectory.
Opzioni : a se l’argomento e’ una directory mostra lo spazio occupato da
ciascun file, non solo dalla directory
s summary, fa vedere lo spazio occupato in totale da ciascun
argomento.
Comando Comando duduComando Comando dudu
166*
equivalente adu .
equivalente adu .
dimensioni in Kbytesdimensioni in Kbytes directorydirectory
167*
Sintassi : limit [resource] [value]
Azione : e’ un commando built-in nella C shell. Elenca le risorse di sistema
disponibili ai process di un utente. Si puo’ usare questo comando per diminuire
(non per aumentare !) i valori assegnati, specificando resource e value.
Sintassi : limit [resource] [value]
Azione : e’ un commando built-in nella C shell. Elenca le risorse di sistema
disponibili ai process di un utente. Si puo’ usare questo comando per diminuire
(non per aumentare !) i valori assegnati, specificando resource e value.
Comando Comando limitlimitComando Comando limitlimit
maximum CPU time assignedmaximum CPU time assigned
maximum size in Kbytes of any one filemaximum size in Kbytes of any one file
maximum size in Kbytesof the core dump file
maximum size in Kbytesof the core dump file
amount of maximum memory(in Kbytes) a user can consume
amount of maximum memory(in Kbytes) a user can consume
maximum processes at the same timemaximum processes at the same time
maximum number open files at the same timemaximum number open files at the same time
168*
pone a zero la massima grandezzapossibile del file core (cioe’ inpratica impedisce la creazione di core ).
pone a zero la massima grandezzapossibile del file core (cioe’ inpratica impedisce la creazione di core ).
169*
7.2 Monitorare il sistema7.2 Monitorare il sistema7.2 Monitorare il sistema7.2 Monitorare il sistema
Esaminiamo ora dei comandi che permettono di sapere come l’insieme di tutti gli utentiusa le risorse di memoria virtuale e di memoria su disco ( comandi vmstat e df ).
Esaminiamo ora dei comandi che permettono di sapere come l’insieme di tutti gli utentiusa le risorse di memoria virtuale e di memoria su disco ( comandi vmstat e df ).
Sintassi : vmstat [option(s)] [delay [count]]
Azione : mostra la statistica della memoria virtuale del sistema, fornendo
anche informazioni sui process, su paging, block IO, traps ed attivita’
della CPU. Il primo output del comando fa una media a partire
dall’ultimo reboot del sistema, successivamente, se delay e’ stato
specificato, le varie quantita’ vengono calcolate ogni delay secondi,
per count volte. Se delay e’ stato specificato ma count no, il
display viene fatto fino ad interruzione del comando con <ctrlC>.
Opzioni : n lo header dell’output del comando viene fatto vedere una volta sola.
Sintassi : vmstat [option(s)] [delay [count]]
Azione : mostra la statistica della memoria virtuale del sistema, fornendo
anche informazioni sui process, su paging, block IO, traps ed attivita’
della CPU. Il primo output del comando fa una media a partire
dall’ultimo reboot del sistema, successivamente, se delay e’ stato
specificato, le varie quantita’ vengono calcolate ogni delay secondi,
per count volte. Se delay e’ stato specificato ma count no, il
display viene fatto fino ad interruzione del comando con <ctrlC>.
Opzioni : n lo header dell’output del comando viene fatto vedere una volta sola.
Comando Comando vmstatvmstatComando Comando vmstatvmstat
170*
memory (in Kb)process statusr : n. waiting for run timeb : n. in uninterruptible sleepw : n. runnable but swapped out
process statusr : n. waiting for run timeb : n. in uninterruptible sleepw : n. runnable but swapped out
virtual memory used
amount of cache
memory used as buffers
free memory
171*
swap spacesi : memory swapped in from disk (Kb/s)so : memory swapped out to disk (Kb/s)
swap spacesi : memory swapped in from disk (Kb/s)so : memory swapped out to disk (Kb/s)
I/Obi : blocks sent to a block device (blocks/s)bo : blocks received from a block device (blocks/s)
I/Obi : blocks sent to a block device (blocks/s)bo : blocks received from a block device (blocks/s)
systemin : n. interrupts per sec.cs : number of context switch per sec.us : % user CPU timesy : % system CPU time
systemin : n. interrupts per sec.cs : number of context switch per sec.us : % user CPU timesy : % system CPU time
ogni 10 secondi, per 5 volteogni 10 secondi, per 5 volte
172*
Sintassi : df [options] [file(s),directory(ies)]
Azione : mostra lo spazio su disco usato e disponibile. Senza argomenti, mostra la
quantita’ di spazio per tutti i file systems montati sulla macchina. Con
argomento file(s) o directory(ies) lista lo spazio disponibile ed
usato del filesystem al quale il file o la directory appartiene.
Opzioni : a all, lista anche i filesystems che hanno dimensione 0
blocksize=SIZE usa come unita’ di misura blocchi da SIZE-byte
k usa come unita’ di misura blocchi da 1024 bytes
i lista l’informazione sugli inodes al posto della dimensioni in blocchi.
Sintassi : df [options] [file(s),directory(ies)]
Azione : mostra lo spazio su disco usato e disponibile. Senza argomenti, mostra la
quantita’ di spazio per tutti i file systems montati sulla macchina. Con
argomento file(s) o directory(ies) lista lo spazio disponibile ed
usato del filesystem al quale il file o la directory appartiene.
Opzioni : a all, lista anche i filesystems che hanno dimensione 0
blocksize=SIZE usa come unita’ di misura blocchi da SIZE-byte
k usa come unita’ di misura blocchi da 1024 bytes
i lista l’informazione sugli inodes al posto della dimensioni in blocchi.
Comando Comando dfdfComando Comando dfdf
173*
mount pointmount point% spaziousato
% spaziousato
spaziodisponibile(Kb)
spaziodisponibile(Kb)
spaziousato(Kb)
spaziousato(Kb)
spazio totaledisponibile in Kb
spazio totaledisponibile in Kb
filesystemsfilesystems
viene mostrato lo spazio su disco disponibileed usato del filesystem al quale la directory/home/boca appartiene
viene mostrato lo spazio su disco disponibileed usato del filesystem al quale la directory/home/boca appartiene
174*
7.3 Modifica dei process7.3 Modifica dei process7.3 Modifica dei process7.3 Modifica dei process
Unix possiede 5 comandi usati comunemente per modificare i process degli utenti :kill , per terminare un process; at , per far partire un process piu’ tardi; crontab ,per schedulare la partenza periodica di jobs, nice per modificare la priorita’ che ilsystema assegna di default ad un process che parte; renice per modificare la priorita’di un process gia’ lanciato e limit , che abbiamo gia’ visto, per ridurre le risorsedisponibili ad un process.
Unix possiede 5 comandi usati comunemente per modificare i process degli utenti :kill , per terminare un process; at , per far partire un process piu’ tardi; crontab ,per schedulare la partenza periodica di jobs, nice per modificare la priorita’ che ilsystema assegna di default ad un process che parte; renice per modificare la priorita’di un process gia’ lanciato e limit , che abbiamo gia’ visto, per ridurre le risorsedisponibili ad un process.
Sintassi : kill [options] [-s signal] [PID] [%jobnumber]
Azione : comando built-in nella C shell. Manda il signal specificato al process
specificato da PID o da %jobnumber .
Opzioni : segnalo l’opzione 9 per far terminare certamente un process.
Sintassi : kill [options] [-s signal] [PID] [%jobnumber]
Azione : comando built-in nella C shell. Manda il signal specificato al process
specificato da PID o da %jobnumber .
Opzioni : segnalo l’opzione 9 per far terminare certamente un process.
Comando Comando killkillComando Comando killkill
175*
jobnumberjobnumber process identificationnumber (PID)
process identificationnumber (PID)
opzione 9 per eliminarecertamente il process
opzione 9 per eliminarecertamente il process
176*
Sintassi : at [options] time
command
...
command
<ctrlD>
Azione : esegue uno o piu’ comandi all’istante specificato da time . La lista dei
comandi da eseguire deve essere messa nelle linee che seguono
at [options] time e deve essere terminata da un <ctrlD>.
L’eventuale output dei comandi che normalmente verrebbe mandato a
stdout , viene invece spedito per mail all’utente. La data puo’ essere
specificata (in LINUX) in vari modi, vedi man at per la lista completa
delle possibilita’. Nel seguito vengono mostrati solo alcuni esempi.
Sintassi : at [options] time
command
...
command
<ctrlD>
Azione : esegue uno o piu’ comandi all’istante specificato da time . La lista dei
comandi da eseguire deve essere messa nelle linee che seguono
at [options] time e deve essere terminata da un <ctrlD>.
L’eventuale output dei comandi che normalmente verrebbe mandato a
stdout , viene invece spedito per mail all’utente. La data puo’ essere
specificata (in LINUX) in vari modi, vedi man at per la lista completa
delle possibilita’. Nel seguito vengono mostrati solo alcuni esempi.
Comando Comando atatComando Comando atat
177*
ora alla qualeil comandoverra’ eseguito
ora alla qualeil comandoverra’ eseguito
178*
data alla qualeil comandoverra’ eseguito
data alla qualeil comandoverra’ eseguito
179*
comando da eseguirecomando da eseguire
180*
il <ctrl>D finaleper segnalareche l’input di ate’ finito
il <ctrl>D finaleper segnalareche l’input di ate’ finito
181*
ora alla quale il comandoverra’ eseguito, in questocaso alle 16:00 (altri modiammessi sono : noon , midnight )
ora alla quale il comandoverra’ eseguito, in questocaso alle 16:00 (altri modiammessi sono : noon , midnight )
182*
Sintassi : crontab [options]
Azione : questo comando edita, lista o rimuove la tabella usata da cron, che e’
un programma daemon che permette di far partire programmi o
comandi in maniera automatica e periodica. Come at fa partire jobs
automaticamente, tuttavia li fa partire periodicamente, ad una data ora
di determinati giorni di determinati mesi dell’anno. Il programma cron
legge la tabella nella quale sono elencati i jobs da far partire, ad ogni
quanto tempo.
Opzioni : l mostra la tabella usata da cron
e edita la tabella usata da cron con l’editor di default
r cancella la tabella usata da cron
Sintassi : crontab [options]
Azione : questo comando edita, lista o rimuove la tabella usata da cron, che e’
un programma daemon che permette di far partire programmi o
comandi in maniera automatica e periodica. Come at fa partire jobs
automaticamente, tuttavia li fa partire periodicamente, ad una data ora
di determinati giorni di determinati mesi dell’anno. Il programma cron
legge la tabella nella quale sono elencati i jobs da far partire, ad ogni
quanto tempo.
Opzioni : l mostra la tabella usata da cron
e edita la tabella usata da cron con l’editor di default
r cancella la tabella usata da cron
Comando Comando crontabcrontabComando Comando crontabcrontab
183*
opzionel : lista la tabella usata da cronopzionel : lista la tabella usata da cron
il minuto (da 0 a 59)in cui deve partire il job
il minuto (da 0 a 59)in cui deve partire il job
NOTA BENE NOTA BENE valori accettati nei campi numerici :- un intero- una lista di interi separati da virgole- due interi separati da per indicare un range- un per indicare tutti i valori possibili
NOTA BENE NOTA BENE valori accettati nei campi numerici :- un intero- una lista di interi separati da virgole- due interi separati da per indicare un range- un per indicare tutti i valori possibili
il giorno del mese (da 1 a 31)in cui deve partire il job
il giorno del mese (da 1 a 31)in cui deve partire il job
l’ora (da 0 a 23) in cuideve partire il job
l’ora (da 0 a 23) in cuideve partire il job
184*
il mese dell’anno (da 1 a 12) in cui deve partire il job( = ogni mese)
il mese dell’anno (da 1 a 12) in cui deve partire il job( = ogni mese)
il giorno della settimanain cui deve partire il job( = ogni giorno)
il giorno della settimanain cui deve partire il job( = ogni giorno)
nome del job da far partirenome del job da far partire
NOTA BENE NOTA BENE si possono specificare i giorni incui far partire il job in due campi(giorno del mese e giorno dellasettimana). Si possono usare siaentrambi i campi, che un campo solo.Se si usa solo un campo, l’altro deveavere l’asterisco.
NOTA BENE NOTA BENE si possono specificare i giorni incui far partire il job in due campi(giorno del mese e giorno dellasettimana). Si possono usare siaentrambi i campi, che un campo solo.Se si usa solo un campo, l’altro deveavere l’asterisco.
185*
Comandi Comandi nice nice ee renice reniceComandi Comandi nice nice ee renice renice
Sintassi : nice number [command]
Azione : questo comando fa partire il nuovo job command con scheduling
priority modificata aggiungendo number alla priorita’ normalmente
assegnata di default dal sistema. La priorita’ aggiuntiva va da -20 (il
job viene eseguito piu’ in fretta) a 19 (esecuzione piu’ lenta).
Tuttavia solo il superuser puo’ assegnare un nice negativo.
Opzioni : ADJUST priorita’ aggiuntiva; il normale utente puo’ usare solo un
valore positivo.
Sintassi : renice number [PID] [-g [pgrp]] [-u [user] ]
Azione : altera la scheduling priority di uno o piu’ jobs che runnano. Per la
priority vale lo stesso discorso fatto per nice. Specificando PID si altera
il nice di un job, specificando -g pgrp si alterano le priorita’ di tutti
i process di quel gruppo, specificando -u user si alterano tutti
quelli di quell’utente.
186*
fa partire il job in normalmente e lo mette in backgroundfa partire il job in normalmente e lo mette in background
Process ID numberProcess ID number priorita’ del jobpriorita’ del job
fa partire il job con nice positiva e lo mette in backgroundfa partire il job con nice positiva e lo mette in background
Process ID numberProcess ID number
187*
nice del jobnice del jobpriorita’ del jobpriorita’ del job
modifica il nice del job 974 che gia’ runnamodifica il nice del job 974 che gia’ runna
188*
QQuesto capitolo tratta della programmazione mediante comandi di shell, raggruppati inuesto capitolo tratta della programmazione mediante comandi di shell, raggruppati in
in costrutti in un file chiamato in costrutti in un file chiamato shell scriptshell script . . Discuteremo solo la sintassi della C (tcsh) shell.
189*
E’ sufficiente scrivere a terminale il nome dello script. Se tale nome e’ dato in forma E’ sufficiente scrivere a terminale il nome dello script. Se tale nome e’ dato in forma relativa, la C shell usera’ la variabile di shell relativa, la C shell usera’ la variabile di shell pathpath per sapere in quali directories cercare per sapere in quali directories cercare lo script. Lo script dovra’ avere la protezione lo script. Lo script dovra’ avere la protezione x x on per poter essere eseguibile.on per poter essere eseguibile.
directories nelle quali viene cercato lo scriptdirectories nelle quali viene cercato lo scriptdirectories nelle quali viene cercato lo scriptdirectories nelle quali viene cercato lo script
8.1 Esecuzione di un shell script8.1 Esecuzione di un shell script8.1 Esecuzione di un shell script8.1 Esecuzione di un shell script
#!/bin/tcsh -f#questa e’ una linea di commentoexit
Come tutti i comandi che non sono built-innella shell, lo script viene eseguito da unchild process con un forking al momentodell’esecuzione del comando. Il child processeredita tutte le variabili di shell definite per ilparent process. In piu’ per esso viene eseguitoil file .cshrc (e .tcshrc) e quindi eredita tuttele definizioni ivi contenute. Quest’ultimacosa viene evitata con l’opzione -f (fast start) e far partire lo script piu’ velocemente
unica eccezione : NON e’ unalinea di commento ma ladichiarazione che il testo chesegue deve essere interpretato dalprogramma /bin/tcsh (la tc shell)
unica eccezione : NON e’ unalinea di commento ma ladichiarazione che il testo chesegue deve essere interpretato dalprogramma /bin/tcsh (la tc shell)
il # serve per commentareil # serve per commentare
190*
Sono gia’ state definite le variabili di shell precedentemente ed e’ gia’ stato detto che ad Sono gia’ state definite le variabili di shell precedentemente ed e’ gia’ stato detto che ad esse si possono assegnare valori tramite il comando esse si possono assegnare valori tramite il comando setset. Riassumiamo qui alcuni . Riassumiamo qui alcuni concetti:concetti:
8.2 Variabili di shell8.2 Variabili di shell8.2 Variabili di shell8.2 Variabili di shell
le variabili di shell sono valide solo per il process per il quale vengono assegnatee per tutta la durata di quest’ultimo. Vengono perse quando si cambia shell.
le variabili di shell sono valide solo per il process per il quale vengono assegnatee per tutta la durata di quest’ultimo. Vengono perse quando si cambia shell.
ad una variabile di shell si possono assegnare sia numeri che caratteriad una variabile di shell si possono assegnare sia numeri che caratteri
il contenuto di una variabile di shell si ottiene facendo precedere il nome dellavariabile dal metacarattere $
il contenuto di una variabile di shell si ottiene facendo precedere il nome dellavariabile dal metacarattere $
ci si e’ dimenticati del $ !!ci si e’ dimenticati del $ !!
valore numericovalore numerico
valore alfanumericovalore alfanumerico
191*
Variabili di shell preassegnateVariabili di shell preassegnateVariabili di shell preassegnateVariabili di shell preassegnate
il comando set senza argomentici da’ la lista delle variabili dishell preassegnate e di quelledefinite dall’utente
il comando set senza argomentici da’ la lista delle variabili dishell preassegnate e di quelledefinite dall’utente
nome della variabile di shellnome della variabile di shell
contenuto dellavariabile di shell
contenuto dellavariabile di shell
192*
Forme speciali di una variabili di shellForme speciali di una variabili di shellForme speciali di una variabili di shellForme speciali di una variabili di shell
La tavola qui sotto riporta le forme speciali che puo’ assumere una variabile di shell che, La tavola qui sotto riporta le forme speciali che puo’ assumere una variabile di shell che, tra l’altro, puo’ contenere piu’ valori, come un vettore. In questo caso (a differenza del tra l’altro, puo’ contenere piu’ valori, come un vettore. In questo caso (a differenza del C) gli elementi del vettore vengono contati a partire da C) gli elementi del vettore vengono contati a partire da . .
$?$?namename 0 se la variabile0 se la variabile namename non e’ definita, 1 se e’ definitanon e’ definita, 1 se e’ definita$#$#namename numero di elementi della variabilenumero di elementi della variabile namename$$namename[[mm]] da’ l’elementoda’ l’elemento m m -esimo della variabile-esimo della variabile$$namename[[mm--nn]] da’ gli elementi dada’ gli elementi da mm aa n n compresi della variabilecompresi della variabile namename$$namename[[mm-]-] da’ gli elementi dada’ gli elementi da m m (compreso) fino all’ultimo della variabile(compreso) fino all’ultimo della variabile namename$$namename[-[-mm]] da’ gli elementi dal primo fino alda’ gli elementi dal primo fino al mm-esimo compresi-esimo compresi
della variabiledella variabile namename$$namename[[]] da’ tutti gli elementi della variabileda’ tutti gli elementi della variabile namename$$namename[$#[$#namename] ] l’ultimo elemento della variabilel’ultimo elemento della variabile namename
TavolaTavola
193*
Forme speciali di una variabili di shellForme speciali di una variabili di shellForme speciali di una variabili di shellForme speciali di una variabili di shell
assegnazione di 8 valoriassegnazione di 8 valorialla variabile di shell alla variabile di shell varvarche cosi’ diventa un vettore.che cosi’ diventa un vettore.Si notino le Si notino le ( )( ) , obbligatorie. , obbligatorie.
assegnazione di 8 valoriassegnazione di 8 valorialla variabile di shell alla variabile di shell varvarche cosi’ diventa un vettore.che cosi’ diventa un vettore.Si notino le Si notino le ( )( ) , obbligatorie. , obbligatorie.
dal secondo al sesto valoredal secondo al sesto valoredella variabile della variabile varvar
dal secondo al sesto valoredal secondo al sesto valoredella variabile della variabile varvar
la variabile la variabile varvar e’ un array di 8 valori e’ un array di 8 valorila variabile la variabile varvar e’ un array di 8 valori e’ un array di 8 valori
la variabile la variabile varvar e’ stata definita e’ stata definitala variabile la variabile varvar e’ stata definita e’ stata definita
dal terzo all’ultimo valore della variabile dal terzo all’ultimo valore della variabile varvardal terzo all’ultimo valore della variabile dal terzo all’ultimo valore della variabile varvar
tutti i valori della variabile tutti i valori della variabile varvartutti i valori della variabile tutti i valori della variabile varvar
ultimo valore contenuto nella variabile ultimo valore contenuto nella variabile varvarultimo valore contenuto nella variabile ultimo valore contenuto nella variabile varvar
194*
Comando Comando shiftshiftComando Comando shiftshift
Shift Shift opera sulle variabili di shell riducendone il opera sulle variabili di shell riducendone il numero di elementi di uno, scartandone ogni numero di elementi di uno, scartandone ogni volta il primo elemento.volta il primo elemento.
SintassiSintassi ::
shift shift variablevariable
SintassiSintassi ::
shift shift variablevariable
#!/bin/tcsh#!/bin/tcshset z = ( uno due 3 )set z = ( uno due 3 )echo “Before using shift there are $#z elements :$z”echo “Before using shift there are $#z elements :$z”while ($#z>0)while ($#z>0) echo $z[1]echo $z[1] shift zshift zendendecho “After using shift there are $#z elements”echo “After using shift there are $#z elements”exitexit
195*
Passare variabili ad uno scriptPassare variabili ad uno scriptPassare variabili ad uno scriptPassare variabili ad uno script
Nella tavola qui sotto vengono indicate i nomi della varibili che possono essere passate al Nella tavola qui sotto vengono indicate i nomi della varibili che possono essere passate al runtimeruntime, piu’ altre utili variabili di shell. Negli esempi ne viene illustrato un possibile , piu’ altre utili variabili di shell. Negli esempi ne viene illustrato un possibile uso.uso.
$$n n o o $argv[$argv[nn]] da’ il valore dellada’ il valore della nn--esima variabile passata allo scriptesima variabile passata allo script$$ da’ il valore di tutte le variabili passate allo scriptda’ il valore di tutte le variabili passate allo script
$$$$ da’ il process number (da’ il process number (PIDPID) della shell corrente) della shell corrente$<$< accetta input dal terminaleaccetta input dal terminale$0$0 variabile contenente il nome dello script che viene eseguitovariabile contenente il nome dello script che viene eseguito$?0$?0 da’ 0 se il nome dello script che viene eseguito e’ conosciuto,da’ 0 se il nome dello script che viene eseguito e’ conosciuto,
1 altrimenti1 altrimenti
TavolaTavola
196*
#!/bin/tcsh# returns variable passed \to scriptecho $argv[1]echo $2echo $argv[$#argv]echo -n “Enter Text String:”set name = $<echo “This script is called $0”echo “This script is being processed by PID $$”echo “The string entered has $#name elements”echo “The first word is $name[1]”echo “The last word is $name[$#name]”exit
Passare variabili ad uno scriptPassare variabili ad uno scriptPassare variabili ad uno scriptPassare variabili ad uno script
input dato da terminalesi notino le parentesi tonde,obbligatorie per poter fardiventare name un vettore
input dato da terminalesi notino le parentesi tonde,obbligatorie per poter fardiventare name un vettore
argomenti passatiargomenti passatia a test_script3
argomenti passatiargomenti passatia a test_script3
continuazione delcontinuazione delcommento allacommento allaprossima rigaprossima riga
continuazione delcontinuazione delcommento allacommento allaprossima rigaprossima riga
197*
I filename modifiers fanno si che il sistema ritorni porzioni di un filename relativo od assoluto, come esemplificato dalla tabella qui sotto, e dallo script test_script4test_script4.
8.3 Filename modifiers8.3 Filename modifiers8.3 Filename modifiers8.3 Filename modifiers
#!/bin/tcshecho -n “Enter filename”set filename = $<echo $filename:recho $filename:eecho $filename:hecho $filename:texit
:r :r da’ la parte del filename che precededa’ la parte del filename che precede ilil . . , se non contiene il, se non contiene il . . , ritorna il, ritorna il nome completonome completo:e :e da’ la parte del filename che segueda’ la parte del filename che segue ilil . . , se non contiene il, se non contiene il . . , da’, da’ NULLNULL:h :h da’ la prima parte del nome assolutoda’ la prima parte del nome assoluto del file (head) quella formata dalledel file (head) quella formata dalle directories.directories.:t :t da’ l’ultima parte del nome assolutoda’ l’ultima parte del nome assoluto del file (tail) cioe’ il nome vero edel file (tail) cioe’ il nome vero e proprio del file.proprio del file.
TavolaTavola
198*
Si e’ gia’ visto precedentemente la funzione dei 3 tipi di quotes usati in Unix : Si e’ gia’ visto precedentemente la funzione dei 3 tipi di quotes usati in Unix : ’ ’’ ’ singlesingle(forward ) quotes(forward ) quotes, , “”“” double quotesdouble quotes, , ```` single backward quotessingle backward quotes o o backticksbackticks..Viene qui riassunto il loro comportamento con le variabili di shell :Viene qui riassunto il loro comportamento con le variabili di shell :
8.4 Variable expansion8.4 Variable expansion8.4 Variable expansion8.4 Variable expansion
le ’ ’’ ’ prevengono ogni tipo di variable expansion la variabile ritorna cosi’la variabile ritorna cosi’com’e’ scrittacom’e’ scritta
le ’ ’’ ’ prevengono ogni tipo di variable expansion la variabile ritorna cosi’la variabile ritorna cosi’com’e’ scrittacom’e’ scritta
le le ```` causano l’immediata esecuzione del comando corrispondente, ed il suo causano l’immediata esecuzione del comando corrispondente, ed il suo(eventuale) (eventuale) stdoutstdout viene sostituito al posto delle viene sostituito al posto delle ````..
le le ```` causano l’immediata esecuzione del comando corrispondente, ed il suo causano l’immediata esecuzione del comando corrispondente, ed il suo(eventuale) (eventuale) stdoutstdout viene sostituito al posto delle viene sostituito al posto delle ````..
le le “”“” raggruppano tutti i caratteri contenuti in esse in un’unica word, permetteraggruppano tutti i caratteri contenuti in esse in un’unica word, permettela variable expansion ma la variable expansion ma NON NON il il globbingglobbing della wildcard ( della wildcard ( ). ).
le le “”“” raggruppano tutti i caratteri contenuti in esse in un’unica word, permetteraggruppano tutti i caratteri contenuti in esse in un’unica word, permettela variable expansion ma la variable expansion ma NON NON il il globbingglobbing della wildcard ( della wildcard ( ). ).
199*
le ’ ’’ ’ prevengono ogni tipo di variable expansion la variabile ritorna cosi’la variabile ritorna cosi’com’e’ scrittacom’e’ scritta
le ’ ’’ ’ prevengono ogni tipo di variable expansion la variabile ritorna cosi’la variabile ritorna cosi’com’e’ scrittacom’e’ scritta
le le “”“” raggruppano tutti i caratteri contenuti in esse in un’unica word, permetteraggruppano tutti i caratteri contenuti in esse in un’unica word, permettela variable expansion ma la variable expansion ma NON NON il il globbingglobbing della wildcard ( della wildcard ( ). ).
le le “”“” raggruppano tutti i caratteri contenuti in esse in un’unica word, permetteraggruppano tutti i caratteri contenuti in esse in un’unica word, permettela variable expansion ma la variable expansion ma NON NON il il globbingglobbing della wildcard ( della wildcard ( ). ).
le le ```` causano l’immediata esecuzione del comando corrispondente, ed il suo causano l’immediata esecuzione del comando corrispondente, ed il suo(eventuale) (eventuale) stdoutstdout viene sostituito al posto delle viene sostituito al posto delle ````..
le le ```` causano l’immediata esecuzione del comando corrispondente, ed il suo causano l’immediata esecuzione del comando corrispondente, ed il suo(eventuale) (eventuale) stdoutstdout viene sostituito al posto delle viene sostituito al posto delle ````..
le le “”“” impediscono il globbing impediscono il globbingdellodello , quindi il valore dato a, quindi il valore dato anamename e’ e’ ls testls test
le le “”“” impediscono il globbing impediscono il globbingdellodello , quindi il valore dato a, quindi il valore dato anamename e’ e’ ls testls test
e’ come se scrivessi e’ come se scrivessi echo ls testecho ls test (cioe’ (cioe’al posto di al posto di $name$name viene messo il suo viene messo il suovalore) e quindi ora c’e’ globbing dello valore) e quindi ora c’e’ globbing dello
e’ come se scrivessi e’ come se scrivessi echo ls testecho ls test (cioe’ (cioe’al posto di al posto di $name$name viene messo il suo viene messo il suovalore) e quindi ora c’e’ globbing dello valore) e quindi ora c’e’ globbing dello
> set name = > set name = ls test*ls test*> echo $name> echo $namels test_script2 test_script3 test_script4ls test_script2 test_script3 test_script4> echo > echo ''$name$name''$name$name> echo “$name”> echo “$name”ls test*ls test*> echo > echo `̀$name$name`̀test_script2 test_script3 test_script4test_script2 test_script3 test_script4
200*
> set name = > set name = ls test*ls test*> echo $name> echo $namels test_script2 test_script3 test_script4ls test_script2 test_script3 test_script4> echo > echo ''$name$name''$name$name> echo “$name”> echo “$name”ls test*ls test*> echo > echo `̀$name$name`̀test_script2 test_script3 test_script4test_script2 test_script3 test_script4
le ’ ’’ ’ prevengono ogni tipo di variable expansion la variabile ritorna cosi’la variabile ritorna cosi’com’e’ scrittacom’e’ scritta
le ’ ’’ ’ prevengono ogni tipo di variable expansion la variabile ritorna cosi’la variabile ritorna cosi’com’e’ scrittacom’e’ scritta
le le ```` causano l’immediata esecuzione del comando corrispondente, ed il suo causano l’immediata esecuzione del comando corrispondente, ed il suo(eventuale) (eventuale) stdoutstdout viene sostituito al posto delle viene sostituito al posto delle ````..
le le ```` causano l’immediata esecuzione del comando corrispondente, ed il suo causano l’immediata esecuzione del comando corrispondente, ed il suo(eventuale) (eventuale) stdoutstdout viene sostituito al posto delle viene sostituito al posto delle ````..
le le ‘’‘’ impediscono la variable impediscono la variablesostitutionsostitution
le le ‘’‘’ impediscono la variable impediscono la variablesostitutionsostitution
le le “”“” permettono la permettono lavariable sostitutionvariable sostitutionma poi impedisconoma poi impedisconoil globbing delloil globbing dello
le le “”“” permettono la permettono lavariable sostitutionvariable sostitutionma poi impedisconoma poi impedisconoil globbing delloil globbing dello
le le “”“” raggruppano tutti i caratteri contenuti in esse in un’unica word, permetteraggruppano tutti i caratteri contenuti in esse in un’unica word, permettela variable expansion ma la variable expansion ma NON NON il il globbingglobbing della wildcard ( della wildcard ( ). ).
le le “”“” raggruppano tutti i caratteri contenuti in esse in un’unica word, permetteraggruppano tutti i caratteri contenuti in esse in un’unica word, permettela variable expansion ma la variable expansion ma NON NON il il globbingglobbing della wildcard ( della wildcard ( ). ).
201*
> set name = > set name = ls test*ls test*> echo $name> echo $namels test_script2 test_script3 test_script4ls test_script2 test_script3 test_script4> echo > echo ''$name$name''$name$name> echo “$name”> echo “$name”ls test*ls test*> echo > echo `̀$name$name`̀test_script2 test_script3 test_script4test_script2 test_script3 test_script4
le ’ ’’ ’ prevengono ogni tipo di variable expansion la variabile ritorna cosi’la variabile ritorna cosi’com’e’ scrittacom’e’ scritta
le ’ ’’ ’ prevengono ogni tipo di variable expansion la variabile ritorna cosi’la variabile ritorna cosi’com’e’ scrittacom’e’ scritta
le le ```` causano l’immediata esecuzione del comando corrispondente, ed il suo causano l’immediata esecuzione del comando corrispondente, ed il suo(eventuale) (eventuale) stdoutstdout viene sostituito al posto delle viene sostituito al posto delle ````..
le le ```` causano l’immediata esecuzione del comando corrispondente, ed il suo causano l’immediata esecuzione del comando corrispondente, ed il suo(eventuale) (eventuale) stdoutstdout viene sostituito al posto delle viene sostituito al posto delle ````..
i backtics i backtics ```` interpretano il interpretano ilcomando racchiuso tra dicomando racchiuso tra diessi, lo eseguono e sostituisconoessi, lo eseguono e sostituisconoal loro posto un eventuale outputal loro posto un eventuale outputmandato a mandato a stdoutstdout . .
i backtics i backtics ```` interpretano il interpretano ilcomando racchiuso tra dicomando racchiuso tra diessi, lo eseguono e sostituisconoessi, lo eseguono e sostituisconoal loro posto un eventuale outputal loro posto un eventuale outputmandato a mandato a stdoutstdout . .
le le “”“” raggruppano tutti i caratteri contenuti in esse in un’unica word, permetteraggruppano tutti i caratteri contenuti in esse in un’unica word, permettela variable expansion ma la variable expansion ma NON NON il il globbingglobbing della wildcard ( della wildcard ( ). ).
le le “”“” raggruppano tutti i caratteri contenuti in esse in un’unica word, permetteraggruppano tutti i caratteri contenuti in esse in un’unica word, permettela variable expansion ma la variable expansion ma NON NON il il globbingglobbing della wildcard ( della wildcard ( ). ).
202*
Gli operatori di comparazione servono nei costrutti di Gli operatori di comparazione servono nei costrutti di flow controlflow control che vedremo in che vedremo in seguito, come seguito, come ifif, , whilewhile etc. e sono elencati nella tabella. Negli esempi invece, viene etc. e sono elencati nella tabella. Negli esempi invece, viene usato il costrutto usato il costrutto if if completo solo per il primo esempio, negli altri il costrutto corretto completo solo per il primo esempio, negli altri il costrutto corretto e’ sottinteso.e’ sottinteso.
8.5 Operatori di comparazione8.5 Operatori di comparazione8.5 Operatori di comparazione8.5 Operatori di comparazione
TavolaTavola== assign value to variableassign value to variable==== equal toequal to!! Boolean NOT Boolean NOT !=!= NOT equal toNOT equal to&& && Boolean ANDBoolean AND|||| Boolean ORBoolean OR>> greater thangreater than<< less thanless than>=>= greater or equal togreater or equal to<=<= less or equal toless or equal to
si noti la negazionesi noti la negazionedell’operatore logicodell’operatore logicoche sta in parentesiche sta in parentesi
si noti la negazionesi noti la negazionedell’operatore logicodell’operatore logicoche sta in parentesiche sta in parentesi
# assignment# assignmentset string = pipposet string = pippo# equal to# equal toif( $i if( $i ==== 10 ) then 10 ) thenecho “numero uguale a 10 “echo “numero uguale a 10 “endifendifif( $string if( $string == == pippo ) then pippo ) then# not equal to# not equal toif( $i if( $i !=!= 2 ) then 2 ) thenif( $string if( $string != != pippo) then pippo) then# greater than 1 and less than 10# greater than 1 and less than 10if( $i if( $i > > 1 1 &&&& $i $i << 10 ) then 10 ) then# equal to 0 or 1# equal to 0 or 1if( $i if( $i ==== 0 0 |||| $i $i ==== 1) then 1) then# not less than nor equal to 10# not less than nor equal to 10if(!($i if(!($i <=<= 10)) then 10)) then
203*
La tavola che segue riassume i tipi di La tavola che segue riassume i tipi di file operatorsfile operators ammessi dalla C shell. Essi ritornano ammessi dalla C shell. Essi ritornanoun valore true o false e vengono quindi usati nei costrutti logici (ad esempio in costrutti un valore true o false e vengono quindi usati nei costrutti logici (ad esempio in costrutti con con ifif).).
8.6 Files operators8.6 Files operators8.6 Files operators8.6 Files operators
TavolaTavola
-d-d true if file is a directorytrue if file is a directory-e-e true if file existstrue if file exists-f-f true if file contains texttrue if file contains text-o -o true if executor of file is ownertrue if executor of file is owner-r-r true if file is readable by executortrue if file is readable by executor-w-w true if file is writable by executortrue if file is writable by executor-x-x true if file is executable by executortrue if file is executable by executor-z-z true if file is emptytrue if file is empty
# true if /usr/fred is a directory# true if /usr/fred is a directoryif( if( -d-d /usr/fred ) then /usr/fred ) then# true if /tmp/file exists# true if /tmp/file existsif ( if ( -e-e /tmp/file) then /tmp/file) then# true if /usr/fred/text contains text# true if /usr/fred/text contains textif ( if ( -f-f /usr/fred/text ) then /usr/fred/text ) then# true if fred owns /usr/fred/file# true if fred owns /usr/fred/fileif ( if ( -o-o /usr/fred/file) then /usr/fred/file) then#true if /usr/fred/file is readable#true if /usr/fred/file is readableif( if( -r-r /usr/fred/file) then /usr/fred/file) then#true if /usr/fred/file is writeable#true if /usr/fred/file is writeableif( if( -w-w /usr/fred/file) then /usr/fred/file) then# true if /usr/fred/file is executable# true if /usr/fred/file is executableif( if( -x-x /usr/fred/file) then /usr/fred/file) then#true if /usr/fred/file is empty#true if /usr/fred/file is emptyif( if( -z-z /usr/fred/file) then /usr/fred/file) then
204*
Affrontiamo ora quegli operatori che Affrontiamo ora quegli operatori che permettono di eseguire calcoli permettono di eseguire calcoli aritmetici con variabili di shell che aritmetici con variabili di shell che contengano valori interi.contengano valori interi.Nella tavola che segue, sono Nella tavola che segue, sono raggruppati prima gli operatori raggruppati prima gli operatori aritmetici, poi quelli che agiscono sui aritmetici, poi quelli che agiscono sui bit di tali variabili.bit di tali variabili.
8.7 Operatori matematici8.7 Operatori matematici8.7 Operatori matematici8.7 Operatori matematici
TavolaTavolaIntegersIntegers== AssignAssign++ AddAdd SubtractSubtract MultiplyMultiply// DivideDivide++++ Increment by 1Increment by 1 Decrement by 1Decrement by 1%% ModuloModulo
BitsBits>>>> Right bit shiftRight bit shift<<<< Left bit shiftLeft bit shift~~ 1’s complement1’s complement!! Logical negationLogical negation|| Inclusive ORInclusive OR^̂ Exclusive ORExclusive OR&& ANDAND
205*
#!/bin/tcsh#!/bin/tcshset i = 15set i = 15@ j = 3@ j = 3echo “i :$i ; j :$j”echo “i :$i ; j :$j”# addition# addition@ k = $i + $j@ k = $i + $jecho “addition : $k”echo “addition : $k”#subtraction#subtraction@ k = $i - $j@ k = $i - $jecho “subtraction : $k”echo “subtraction : $k”#division#division@ k = $i / $j@ k = $i / $jecho “division : $k”echo “division : $k”# multiplication# multiplication@ k = $i * $j@ k = $i * $jecho “multiplication : $k”echo “multiplication : $k”# modulo# modulo@ k = $i % $j@ k = $i % $jecho “modulo : $k”echo “modulo : $k”# autoincrement# autoincrementset k = 10set k = 10@ k++@ k++echo “autoincrement : $k”echo “autoincrement : $k”
si noti si noti @ piu’ lo spazio bianco@ piu’ lo spazio bianco che indica che la che indica che la variabile di shellvariabile di shell k k deve avere come valore il deve avere come valore il risultato dell’operazione a destra dell’uguale.risultato dell’operazione a destra dell’uguale.
si noti si noti @ piu’ lo spazio bianco@ piu’ lo spazio bianco che indica che la che indica che la variabile di shellvariabile di shell k k deve avere come valore il deve avere come valore il risultato dell’operazione a destra dell’uguale.risultato dell’operazione a destra dell’uguale.
206*
# autodecrement# autodecrementset k = 10set k = 10@ k@ kecho “autodecrement : $k”echo “autodecrement : $k”# right bit shift# right bit shift@ k = ( $i >> 2 )@ k = ( $i >> 2 )echo “right bit shift i by 2 : $k”echo “right bit shift i by 2 : $k”# left bit shift# left bit shift@ k = ( $i << 2 )@ k = ( $i << 2 )echo “left bit shift i by 2 : $k”echo “left bit shift i by 2 : $k”# invert bits# invert bits@ k = ~ $i@ k = ~ $iecho “invert bits : $k”echo “invert bits : $k”# logical negation# logical negation@ k = ! $i@ k = ! $iecho “logical negation : $k”echo “logical negation : $k”# bitwise inclusive OR# bitwise inclusive OR@ k = ( $i | $j )@ k = ( $i | $j )echo “bitwise inclusive OR : $k”echo “bitwise inclusive OR : $k”# bitwise exclusive OR# bitwise exclusive OR@ k = ( $i ^ $j )@ k = ( $i ^ $j )echo “bitwise exclusive OR : $k”echo “bitwise exclusive OR : $k”# bitwise AND# bitwise AND@ k = ( $i & $j )@ k = ( $i & $j )echo “bitwise AND : $k”echo “bitwise AND : $k”
207*
Gli statements di Gli statements di flow controlflow control servono a direzionare la servono a direzionare la sequenza di istruzioni da eseguire in dipendenza dal sequenza di istruzioni da eseguire in dipendenza dal verificarsi di determinate condizioni.verificarsi di determinate condizioni.Nella C shell questi comandi sono molto simili a quelli del Nella C shell questi comandi sono molto simili a quelli del linguaggio C e sono elencati nella tavola qui sotto.linguaggio C e sono elencati nella tavola qui sotto.
8.8 Flow control8.8 Flow control8.8 Flow control8.8 Flow control
Tavola degli statementsTavola degli statementsdi flow controldi flow control
ififwhilewhileforeachforeachswitchswitchgotogoto
208*
Comando Comando ififComando Comando ifif
Come nel linguaggio C, questo comando provoca un branching semplice, doppio o Come nel linguaggio C, questo comando provoca un branching semplice, doppio o multiplo.multiplo.
SintassiSintassi : : if ( if ( conditioncondition ) ) statement statement
oppure : oppure : if ( if ( conditioncondition ) then ) then
[[statementsstatements]]
endifendif
oppure : oppure : if ( if ( conditioncondition ) then ) then
[[statementsstatements]]
elseelse
[[statementsstatements]]
endifendif
SintassiSintassi : : if ( if ( conditioncondition ) ) statement statement
oppure : oppure : if ( if ( conditioncondition ) then ) then
[[statementsstatements]]
endifendif
oppure : oppure : if ( if ( conditioncondition ) then ) then
[[statementsstatements]]
elseelse
[[statementsstatements]]
endifendif
oppure : oppure : if ( if ( conditioncondition ) then ) then
[[statementsstatements]]
else if ( else if ( conditioncondition ) then ) then
[[statementsstatements]]
……
[[ else if ( else if ( conditioncondition ) then ) then
statements statements ]]
......
[[ else else
statements statements ]]
endifendif
oppure : oppure : if ( if ( conditioncondition ) then ) then
[[statementsstatements]]
else if ( else if ( conditioncondition ) then ) then
[[statementsstatements]]
……
[[ else if ( else if ( conditioncondition ) then ) then
statements statements ]]
......
[[ else else
statements statements ]]
endifendif
209*
Comando Comando ififComando Comando ifif
#!/bin/tcsh#!/bin/tcsh# report a file executable satus# report a file executable satusecho -n “enter filename”echo -n “enter filename”set a = $<set a = $<if (-x $a) thenif (-x $a) thenecho “$a is an executable”echo “$a is an executable”elseelseecho “$a is not an executable”echo “$a is not an executable”endifendifexitexit
#!/bin/tcsh#!/bin/tcsh# displays a non-empty file# displays a non-empty fileif(-z $1) thenif(-z $1) thenecho “File $1 is empty”echo “File $1 is empty”exitexitendifendifmore $1more $1exitexit
piccolo script che riporta se il filepiccolo script che riporta se il fileche diamo come input da terminale,che diamo come input da terminale,e’ un eseguibilee’ un eseguibile
piccolo script che riporta se il filepiccolo script che riporta se il fileche diamo come input da terminale,che diamo come input da terminale,e’ un eseguibilee’ un eseguibile
file operator che rende verafile operator che rende veral’espressione se l’espressione se $a$a e’ un eseguibile e’ un eseguibile
file operator che rende verafile operator che rende veral’espressione se l’espressione se $a$a e’ un eseguibile e’ un eseguibile
file operator che rende verafile operator che rende veral’espressione se l’espressione se $a$a e’ vuoto e’ vuoto
file operator che rende verafile operator che rende veral’espressione se l’espressione se $a$a e’ vuoto e’ vuoto
piccolo script che riporta se il filepiccolo script che riporta se il fileche diamo come argomento, e’ nonche diamo come argomento, e’ nonvuoto ed in tal caso lo stampa avuoto ed in tal caso lo stampa aterminale.terminale.
piccolo script che riporta se il filepiccolo script che riporta se il fileche diamo come argomento, e’ nonche diamo come argomento, e’ nonvuoto ed in tal caso lo stampa avuoto ed in tal caso lo stampa aterminale.terminale.
210*
Comando Comando whilewhileComando Comando whilewhile
Come nel linguaggio C, questo e’ un Come nel linguaggio C, questo e’ un comando di loop, che viene eseguito comando di loop, che viene eseguito finche’ una certa condizione e’ vera.finche’ una certa condizione e’ vera.
SintassiSintassi ::
while ( while ( conditioncondition ) )
......
[[statementsstatements]]
......
endend
SintassiSintassi ::
while ( while ( conditioncondition ) )
......
[[statementsstatements]]
......
endend
#!/bin/tcsh#!/bin/tcsh# displays calendar by month# displays calendar by monthset i = 1set i = 1while ($i != 13)while ($i != 13)cal $i 2002cal $i 2002@ i = ($i + 1)@ i = ($i + 1)endendecho “Calendar complete”echo “Calendar complete”exitexit
se se $i$i non e’ uguale a non e’ uguale a 33se se $i$i non e’ uguale a non e’ uguale a 33
211*
#!/bin/tcsh#!/bin/tcsh# displays characteristics# displays characteristics# of files of the list# of files of the listset files = ( test1 test2 test3 )set files = ( test1 test2 test3 )foreach i ( $files )foreach i ( $files )ls -l $ils -l $iendendexitexit
Comando Comando foreachforeachComando Comando foreachforeach
Anche questo e’ un comando di loop che Anche questo e’ un comando di loop che esegue un blocco di statements per ogni esegue un blocco di statements per ogni componente di una lista di elementi.componente di una lista di elementi.
SintassiSintassi ::
foreach foreach variable variable ( ( list list ) )
......
[[statementsstatements]]
......
endend
SintassiSintassi ::
foreach foreach variable variable ( ( list list ) )
......
[[statementsstatements]]
......
endend#!/bin/tcsh#!/bin/tcsh# displays all .txt files# displays all .txt filesforeach i ( foreach i ( .txt ).txt )cat $icat $iendendexitexit
l’uso di l’uso di crea una lista dicrea una lista difiles che terminano con files che terminano con .txt.txtLa variabile di shell La variabile di shell i i assume,assume,uno per volta, tutti i valori diuno per volta, tutti i valori ditale lista.tale lista.
l’uso di l’uso di crea una lista dicrea una lista difiles che terminano con files che terminano con .txt.txtLa variabile di shell La variabile di shell i i assume,assume,uno per volta, tutti i valori diuno per volta, tutti i valori ditale lista.tale lista. in questo esempio, la lista diin questo esempio, la lista di
valori chevalori che i i assume, e’ stataassume, e’ statadefinita direttamente nellodefinita direttamente nelloscript.script.
in questo esempio, la lista diin questo esempio, la lista divalori chevalori che i i assume, e’ stataassume, e’ statadefinita direttamente nellodefinita direttamente nelloscript.script.
212*
SintassiSintassi ::
switch ( switch ( stringstring ))
case case stringstring::
[[statementsstatements]]
[[breakswbreaksw]]
case case string2string2::
[[statementsstatements]]
[[breakswbreaksw]]
......
case case stringnstringn::
[[statementsstatements]]
[[breakswbreaksw]]
[[default:default:]]
[[statementsstatements]]
endswendsw
SintassiSintassi ::
switch ( switch ( stringstring ))
case case stringstring::
[[statementsstatements]]
[[breakswbreaksw]]
case case string2string2::
[[statementsstatements]]
[[breakswbreaksw]]
......
case case stringnstringn::
[[statementsstatements]]
[[breakswbreaksw]]
[[default:default:]]
[[statementsstatements]]
endswendsw
#!/bin/tcsh#!/bin/tcshecho “select printer ; l or <cr> for laser, p for plotter”echo “select printer ; l or <cr> for laser, p for plotter”set var = $<set var = $<switch ( $var )switch ( $var )case l:case l: lpr -Plaser $1lpr -Plaser $1 breakswbreakswcase p:case p: lpr -Pplotter $1lpr -Pplotter $1 breakswbreakswdefault:default: lpr -Plaser $1lpr -Plaser $1endswendswexitexit
Comando Comando switchswitchComando Comando switchswitchQuesto e’ un comando di flow control del tutto analogo al corrispondente Questo e’ un comando di flow control del tutto analogo al corrispondente comando in C. Il flusso di istruzione da eseguire viene diretto a quella comando in C. Il flusso di istruzione da eseguire viene diretto a quella case case labellabel la cui label corrisponde al valore della variabile dello la cui label corrisponde al valore della variabile dello switchswitch. Si puo’ poi . Si puo’ poi definire anche una label (comando definire anche una label (comando default:default:) per i casi in cui la variabile dello ) per i casi in cui la variabile dello switch switch non corrisponda a nessuna altra label. Infine il comando non corrisponda a nessuna altra label. Infine il comando breakswbreaksw serve serve per far saltare fuori dal costrutto di per far saltare fuori dal costrutto di switchswitch e far eseguire la prima istruzione e far eseguire la prima istruzione che segue che segue endswendsw..
var var e’ la variabile dello e’ la variabile dello switchswitchvar var e’ la variabile dello e’ la variabile dello switchswitch
se se var var ha valoreha valore p p il programma salta qui il programma salta quied esegue tutti i comandi che seguonoed esegue tutti i comandi che seguono
se se var var ha valoreha valore p p il programma salta qui il programma salta quied esegue tutti i comandi che seguonoed esegue tutti i comandi che seguono
il programma salta alla prima istruzioneil programma salta alla prima istruzionedopo dopo endswendsw poiche’ qui c’e’ poiche’ qui c’e’ breakswbreaksw
il programma salta alla prima istruzioneil programma salta alla prima istruzionedopo dopo endswendsw poiche’ qui c’e’ poiche’ qui c’e’ breakswbreaksw
se se var var NON ha ne’ valoreNON ha ne’ valore p p ne’ valore ne’ valore l lil programma salta qui ed esegue tutti iil programma salta qui ed esegue tutti icomandi che seguonocomandi che seguono
se se var var NON ha ne’ valoreNON ha ne’ valore p p ne’ valore ne’ valore l lil programma salta qui ed esegue tutti iil programma salta qui ed esegue tutti icomandi che seguonocomandi che seguono
213*
#!/bin/tcsh#!/bin/tcshif ($1 == “” ) goto undefinedif ($1 == “” ) goto undefinedecho “the value of variable 1 is :$1”echo “the value of variable 1 is :$1”exitexitundefined:undefined:echo “Variable 1 is undefined”echo “Variable 1 is undefined”exitexit
Comando Comando gotogotoComando Comando gotogoto
Il flusso d’esecuzione dei comandi viene ridiretto Il flusso d’esecuzione dei comandi viene ridiretto all’istruzione marcata dalla label all’istruzione marcata dalla label labellabel. Anche questo . Anche questo e’ un comando che ha una eguale controparte nel C.e’ un comando che ha una eguale controparte nel C.
SintassiSintassi ::
goto goto labellabel
SintassiSintassi ::
goto goto labellabel
In questo esempio viene stampatoIn questo esempio viene stampatoa terminale il valore della primaa terminale il valore della primavariabile passata allo script, se l’utentevariabile passata allo script, se l’utentel’ha passata effettivamente.l’ha passata effettivamente.Nel caso contrario, viene stampatoNel caso contrario, viene stampatoil messaggio :il messaggio :Variable Variable is undefined is undefined
In questo esempio viene stampatoIn questo esempio viene stampatoa terminale il valore della primaa terminale il valore della primavariabile passata allo script, se l’utentevariabile passata allo script, se l’utentel’ha passata effettivamente.l’ha passata effettivamente.Nel caso contrario, viene stampatoNel caso contrario, viene stampatoil messaggio :il messaggio :Variable Variable is undefined is undefined
si noti che la label si noti che la label undefinedundefineddevedeve essere seguita da essere seguita da ::
si noti che la label si noti che la label undefinedundefineddevedeve essere seguita da essere seguita da ::
214*
Error handling and flow controlError handling and flow controlError handling and flow controlError handling and flow control
Error handlingError handling significa dirigere il flusso di istruzioni a seconda che un comando vada significa dirigere il flusso di istruzioni a seconda che un comando vada a buon fine o abbia esito negativo. In Unix questo si puo’ fare almeno in due modi, sia a buon fine o abbia esito negativo. In Unix questo si puo’ fare almeno in due modi, sia usando gli operatori logici usando gli operatori logici || || e e &&&& , sia usando direttamente la varibile di shell , sia usando direttamente la varibile di shell statusstatus , , che assume generalmente valore che assume generalmente valore 00 quando comando va a buon fine. quando comando va a buon fine.
Sintassi OR logico :Sintassi OR logico :
commandcommand |||| command2 command2
Sintassi AND logico :Sintassi AND logico :
commandcommand &&&& command2 command2
Sintassi OR logico :Sintassi OR logico :
commandcommand |||| command2 command2
Sintassi AND logico :Sintassi AND logico :
commandcommand &&&& command2 command2
Funzionamento degli operatoriFunzionamento degli operatorilogici usati con comandilogici usati con comandi
command 1 operator command 2command 1 operator command 2succeeds executessucceeds executesyes yes || || no nono no || || yes yesyes yes && && yes yesno no && && no no
Cominciamo con gli operatori logiciCominciamo con gli operatori logici
215*… … spedisci un mail con l’elenco dispedisci un mail con l’elenco ditali utentitali utenti
… … spedisci un mail con l’elenco dispedisci un mail con l’elenco ditali utentitali utenti
#!/bin/tcsh#!/bin/tcshcc test.c >& error cc test.c >& error || || mail studente < error mail studente < error
Error handling and flow controlError handling and flow controlError handling and flow controlError handling and flow control
se la compilazione del programmase la compilazione del programmain C test.c in C test.c NON NON va a buon fine …va a buon fine …
se la compilazione del programmase la compilazione del programmain C test.c in C test.c NON NON va a buon fine …va a buon fine …
#!/bin/tcsh#!/bin/tcshgrep tcsh /etc/passwd > lista grep tcsh /etc/passwd > lista &&&& mail studente < lista mail studente < lista
se nel file delle passwords esistonose nel file delle passwords esistonoutenti che usano la tcsh shell …utenti che usano la tcsh shell …
se nel file delle passwords esistonose nel file delle passwords esistonoutenti che usano la tcsh shell …utenti che usano la tcsh shell …
… … spedisci un mail con gli errori dispedisci un mail con gli errori dicompilazione all’utente compilazione all’utente studentestudente
… … spedisci un mail con gli errori dispedisci un mail con gli errori dicompilazione all’utente compilazione all’utente studentestudente
216*
Error handling and flow controlError handling and flow controlError handling and flow controlError handling and flow control
Uso della variable di shell Uso della variable di shell statusstatus
La variabile La variabile status status viene ridefinita dopo viene ridefinita dopo l’esecuzione di ogni comando o shell l’esecuzione di ogni comando o shell script.script.Sfortunatamente il valore assunto non Sfortunatamente il valore assunto non e’ consistente per tutti i comandi ed e’ e’ consistente per tutti i comandi ed e’ generalmente anche dipendente dai vari generalmente anche dipendente dai vari flavours flavours di Unix. In generale si tenga di Unix. In generale si tenga presente che se presente che se statusstatus e’ e’ 00 vuol dire che vuol dire che l’esecuzione del comando ha avuto l’esecuzione del comando ha avuto successo, se successo, se statusstatus =1=1 vuol dire che la vuol dire che la sintassi era giusta, ma il comando non sintassi era giusta, ma il comando non ha in qualche modo raggiunto lo scopo ha in qualche modo raggiunto lo scopo che si era prefisso, infine se che si era prefisso, infine se statusstatus ha ha qualche altro valore vuol dire che la qualche altro valore vuol dire che la sintassi non era corretta o qualche file sintassi non era corretta o qualche file non esiste. Ad ogni modo e’ buona non esiste. Ad ogni modo e’ buona norma controllare sempre come si norma controllare sempre come si comporta comporta statusstatus quando lo si vuole quando lo si vuole usare in uno script.usare in uno script.
Il file prrrr.txtnon esiste; status e’
Il file prrrr.txtnon esiste; status e’
Il comandoha avutosuccesso,status e’ 0
Il comandoha avutosuccesso,status e’ 0
Sintassi giusta,ma pallino non e’stato trovato ;status e’
Sintassi giusta,ma pallino non e’stato trovato ;status e’
217*
Error handling and flow controlError handling and flow controlError handling and flow controlError handling and flow control
Ecco un esempio di script in cui viene eseguito il comando Ecco un esempio di script in cui viene eseguito il comando grepgrep sui due argomenti sui due argomenti passati allo script. Viene quindi sfruttata la variabile passati allo script. Viene quindi sfruttata la variabile status status per fare un minimo di per fare un minimo di error handling.error handling.
Ecco un esempio di script in cui viene eseguito il comando Ecco un esempio di script in cui viene eseguito il comando grepgrep sui due argomenti sui due argomenti passati allo script. Viene quindi sfruttata la variabile passati allo script. Viene quindi sfruttata la variabile status status per fare un minimo di per fare un minimo di error handling.error handling.
Uso della variable di shell Uso della variable di shell statusstatus
#!/bin/tcsh#!/bin/tcshgrep $1 $2grep $1 $2set error = $statusset error = $statusif( $error == 0) thenif( $error == 0) then echo “execution successful”echo “execution successful”else if ($error == 1 ) thenelse if ($error == 1 ) then echo “nothing found”echo “nothing found”elseelse echo “severe error found you, idiot !”echo “severe error found you, idiot !”endifendifexitexit
Lo script vuole dueargomenti nella chiamata :$e’ il pattern da cercare,$2 e’ il file in cui cercare.
Lo script vuole dueargomenti nella chiamata :$e’ il pattern da cercare,$2 e’ il file in cui cercare.
Il pattern non c’e’ nelfile; status e’ .
Il pattern non c’e’ nelfile; status e’ .Gli argomenti
passati a grepgenerano unerrore disintassi !
Gli argomentipassati a grepgenerano unerrore disintassi !
218*
8.9 Comandi built-in nella C shell8.9 Comandi built-in nella C shell8.9 Comandi built-in nella C shell8.9 Comandi built-in nella C shell
E’ E’ gia’ stato detto precedentemente dei comandi built-in nella C shell. Esempi digia’ stato detto precedentemente dei comandi built-in nella C shell. Esempi di
di tali comandi sono di tali comandi sono aliasalias,, bg bg,, cd cd,, dirs dirs,, echo echo, , fgfg,, history history,, if if ((else else etc. ),etc. ), jobs jobs, , killkill,, limit limit,,logoutlogout,, nice nice, , popdpopd, , pushdpushd,, set set, , setenvsetenv,, shift shift,, switch switch, , umaskumask,, unalias unalias,, unlimit unlimit,, unset unset,,unsetenvunsetenv, , whichwhich,, while while..Vengono introdotti qui altri comandi built-in utili nella programmazione della C shell.Vengono introdotti qui altri comandi built-in utili nella programmazione della C shell.Si tratta di :Si tratta di :
onintronintrevalevaltimetimesourcesource
ridireziona il flusso di istruzioni quando viene mandato un interrupt allo script
ridireziona il flusso di istruzioni quando viene mandato un interrupt allo script
determina quant’e’ il tempodi esecuzione di un comando
determina quant’e’ il tempodi esecuzione di un comando
prende i comandi da eseguire da una sorgente (source, appunto; tipicamente un ASCII file).Eventuali definizione di shell variables e di alias NON vengono perse dopo l’esecuzione di tutti i comandi contenuti nella sorgente
prende i comandi da eseguire da una sorgente (source, appunto; tipicamente un ASCII file).Eventuali definizione di shell variables e di alias NON vengono perse dopo l’esecuzione di tutti i comandi contenuti nella sorgente
forza l’esecuzione di un comando interpretando eventuali metacaratteri presenti nel comando
forza l’esecuzione di un comando interpretando eventuali metacaratteri presenti nel comando
219*
Questo comando ridirige il flusso dello script quando l’utente da’ un Questo comando ridirige il flusso dello script quando l’utente da’ un <ctrl>C<ctrl>C interrupt interruptda tastiera. Il flusso di comandi dello script, invece di interrompersi semplicemente,da tastiera. Il flusso di comandi dello script, invece di interrompersi semplicemente,salta alla label indicata ed esegue i comandi a partire da li’ come indicato nell’esempiosalta alla label indicata ed esegue i comandi a partire da li’ come indicato nell’esempioseguente.seguente.
Comando Comando onintronintrComando Comando onintronintr
#!/bin/tcsh#!/bin/tcsh# partial example of interrupt handling# partial example of interrupt handlingonintr onintr pippopippo……exitexitpippo:pippo:echo “script terminated abnormally”echo “script terminated abnormally”exitexit
Se l’utente da’ un Se l’utente da’ un <ctrl>C<ctrl>Cil comando salta alla labelil comando salta alla labelindicata (indicata (pippopippo) ed esegue) ed eseguei comandi che seguonoi comandi che seguono
Se l’utente da’ un Se l’utente da’ un <ctrl>C<ctrl>Cil comando salta alla labelil comando salta alla labelindicata (indicata (pippopippo) ed esegue) ed eseguei comandi che seguonoi comandi che seguono
220*
E gia’ stato detto precedentemente che generalmente per eseguire dei comandi che nonE gia’ stato detto precedentemente che generalmente per eseguire dei comandi che nonsiano built-in, la C shell genera un child process. Nei casi pero’ in cui il comando siasiano built-in, la C shell genera un child process. Nei casi pero’ in cui il comando siacontenuto ad esempio in una contenuto ad esempio in una shell variableshell variable, il child process , il child process NONNON interpreta eventuali interpreta eventualimetacaratteri in esso presenti, ma prende ogni elemento letteralmente e questo puo’metacaratteri in esso presenti, ma prende ogni elemento letteralmente e questo puo’produrre risultati del tutto non voluti. Il comando produrre risultati del tutto non voluti. Il comando eval eval e’ utile in questo caso, poiche’e’ utile in questo caso, poiche’forza l’esecuzione da parte della current shell (cioe’ senza forking) interpretandoeventuali metacaratteri presenti nel comando. L’esempio che segue dovrebbe chiarire ilproblema.
Comando Comando evalevalComando Comando evaleval
221*
Comando Comando evalevalComando Comando evaleval
Qui l’intenzione e’ di far eseguireil comando ls -l | grep example_0
Qui l’intenzione e’ di far eseguireil comando ls -l | grep example_0
Il comando (command string)e’ stato depositato nella variabile test
Il comando (command string)e’ stato depositato nella variabile test
eval ci viene in soccorsointerpretando | comemetacarattere di pipinged eseguendo il comandocome volevamo !
eval ci viene in soccorsointerpretando | comemetacarattere di pipinged eseguendo il comandocome volevamo !
Il metacarattere | non vienericonosciuto come tale maletteralmente come nome di file!
Il metacarattere | non vienericonosciuto come tale maletteralmente come nome di file!
222*
Il comando Il comando timetime lancia un comando od uno script e ne fornisce anche il tempo che ci lancia un comando od uno script e ne fornisce anche il tempo che ci vuole per eseguirlo. Se non gli viene dato un argomento, vuole per eseguirlo. Se non gli viene dato un argomento, timetime riporta il tempo usato riporta il tempo usato dal parent process e da tutti i suoi child processes dall’inizio della sessione.dal parent process e da tutti i suoi child processes dall’inizio della sessione.
Comando Comando timetimeComando Comando timetime SintassiSintassi ::
time time [command]
SintassiSintassi ::
time time [command]
lancia lo script lancia lo script myscriptmyscript e ne calcola il tempo e ne calcola il tempolancia lo script lancia lo script myscriptmyscript e ne calcola il tempo e ne calcola il tempo
uuser timeser timeconsumatoconsumato
uuser timeser timeconsumatoconsumato
ssystem timeystem timeconsumatoconsumato
ssystem timeystem timeconsumatoconsumato
tempo solaretempo solaretrascorsotrascorso
tempo solaretempo solaretrascorsotrascorso
% delle risorse% delle risorsedi CPU usato
% delle risorse% delle risorsedi CPU usato
Kb di physical memoryKb di physical memory+ 2 Kb di memory stack+ 2 Kb di memory stack
Kb di physical memoryKb di physical memory+ 2 Kb di memory stack+ 2 Kb di memory stack
page faulted in +page faulted in + page faulted outpage faulted out
page faulted in +page faulted in + page faulted outpage faulted out
page (cioe’ 512 bytes) inputpage (cioe’ 512 bytes) input++ page di output sul disco page di output sul disco
page (cioe’ 512 bytes) inputpage (cioe’ 512 bytes) input++ page di output sul disco page di output sul disco
0 minuti e 22.21 secondi 2.801 secondi
223*
Questo comando serve quando si vogliono eseguire i comandi da una Questo comando serve quando si vogliono eseguire i comandi da una sorgentesorgente ( (sourcesource, , appunto) che tipicamente e’ un file ASCII. Questo risultato si potrebbe ottenere appunto) che tipicamente e’ un file ASCII. Questo risultato si potrebbe ottenere ugualmente dando direttamente il comando ugualmente dando direttamente il comando sorgentesorgente da da STDINSTDIN (a patto (a patto che il file abbia la protezione che il file abbia la protezione xx on). on).La differenza e’ che con La differenza e’ che con sourcesource eventuali definizione di shell variables ed eventuali eventuali definizione di shell variables ed eventualidefinizioni con definizioni con aliasalias NON NON vengono perse dopo l’esecuzione di tutti i comandi contenuti vengono perse dopo l’esecuzione di tutti i comandi contenuti in in sorgente sorgente ma continuano a valere per la current shell. ma continuano a valere per la current shell.
Comando Comando sourcesourceComando Comando sourcesource
SintassiSintassi ::
source source [-h] sorgente
Opzione : Opzione : -h-h serve solo per mettere i comandi contenuti in serve solo per mettere i comandi contenuti in sorgentesorgente nella nella
history listhistory list (per default (per default NONNON ci vengono messi) ; i comandi ci vengono messi) ; i comandi NONNON
vengono effettivamente eseguiti.vengono effettivamente eseguiti.
SintassiSintassi ::
source source [-h] sorgente
Opzione : Opzione : -h-h serve solo per mettere i comandi contenuti in serve solo per mettere i comandi contenuti in sorgentesorgente nella nella
history listhistory list (per default (per default NONNON ci vengono messi) ; i comandi ci vengono messi) ; i comandi NONNON
vengono effettivamente eseguiti.vengono effettivamente eseguiti.
224*
Comando Comando sourcesourceComando Comando sourcesource#!/bin/tcsh#!/bin/tcsh# definizioni di variabili ed esecuzione \# definizioni di variabili ed esecuzione \di lsdi lsset var1 = testset var1 = test##lslsexitexit
pwd/home/bocalsprogram.f program.x prova.com test_script zoomtest_scriptprogram.f program.x prova.com test_script zoomecho $var1var1: Undefined variablesource test_scriptprogram.f program.x prova.com test_script zoomecho $var1test
esegue direttamente lo scriptesegue direttamente lo scriptesegue direttamente lo scriptesegue direttamente lo script
la variabile di shell la variabile di shell varvar viene persa viene persadopo l’esecuzione di test_scriptdopo l’esecuzione di test_script
la variabile di shell la variabile di shell varvar viene persa viene persadopo l’esecuzione di test_scriptdopo l’esecuzione di test_script
con con source source la variabile di shell la variabile di shell varvar mantiene mantienela sua definizione anche nella current shellla sua definizione anche nella current shell
con con source source la variabile di shell la variabile di shell varvar mantiene mantienela sua definizione anche nella current shellla sua definizione anche nella current shell
225*
8.10 Debugging8.10 Debugging8.10 Debugging8.10 Debugging
Si puo’ fare il Si puo’ fare il debuggingdebugging (eliminazione degli errori di programmazione) di uno shell (eliminazione degli errori di programmazione) di uno shell script eseguendo lo script mediante il comando script eseguendo lo script mediante il comando csh csh con determinate opzioni; tra tutte con determinate opzioni; tra tutte esaminiamo qui solo esaminiamo qui solo xx e e vv
SintassiSintassi ::
csh csh [-options] script
Opzione : Opzione : xx ripete le linee di comando dopo aver eseguito eventuali ripete le linee di comando dopo aver eseguito eventuali
variable substitutions. Utile per localizzare problemi legativariable substitutions. Utile per localizzare problemi legati
a variable substitutions.a variable substitutions.
vv ripete le linee di comando ripete le linee di comando PRIMAPRIMA di aver eseguito eventuali di aver eseguito eventuali
variable substitutions. Utile per localizzare quale comandovariable substitutions. Utile per localizzare quale comando
fa fallire lo script.fa fallire lo script.
SintassiSintassi ::
csh csh [-options] script
Opzione : Opzione : xx ripete le linee di comando dopo aver eseguito eventuali ripete le linee di comando dopo aver eseguito eventuali
variable substitutions. Utile per localizzare problemi legativariable substitutions. Utile per localizzare problemi legati
a variable substitutions.a variable substitutions.
vv ripete le linee di comando ripete le linee di comando PRIMAPRIMA di aver eseguito eventuali di aver eseguito eventuali
variable substitutions. Utile per localizzare quale comandovariable substitutions. Utile per localizzare quale comando
fa fallire lo script.fa fallire lo script.
226*
8.10 Debugging8.10 Debugging8.10 Debugging8.10 Debugging
esegue lo script ripetendo iesegue lo script ripetendo icomandi comandi DOPO DOPO aver fatto ...aver fatto ...
esegue lo script ripetendo iesegue lo script ripetendo icomandi comandi DOPO DOPO aver fatto ...aver fatto ...
… … la variable sustitutionla variable sustitution… … la variable sustitutionla variable sustitution
esegue lo script ripetendo i comandiesegue lo script ripetendo i comandiletteralmente, come sarebbero letteralmente, come sarebbero SENZASENZAla variable substitutionla variable substitution
esegue lo script ripetendo i comandiesegue lo script ripetendo i comandiletteralmente, come sarebbero letteralmente, come sarebbero SENZASENZAla variable substitutionla variable substitution
227*
Si definisco programmi di Si definisco programmi di text processingtext processing quelli che leggono un file di input ASCII, lo quelli che leggono un file di input ASCII, lo manipolano in vari modi e generalmente producono un testo di output. manipolano in vari modi e generalmente producono un testo di output.
Si definisco programmi di Si definisco programmi di text processingtext processing quelli che leggono un file di input ASCII, lo quelli che leggono un file di input ASCII, lo manipolano in vari modi e generalmente producono un testo di output. manipolano in vari modi e generalmente producono un testo di output.
In questa categoria possiamo mettere i comandi di screen editor In questa categoria possiamo mettere i comandi di screen editor vivi e e neditnedit gia’ visti in gia’ visti in precedenza.precedenza.
In questa categoria possiamo mettere i comandi di screen editor In questa categoria possiamo mettere i comandi di screen editor vivi e e neditnedit gia’ visti in gia’ visti in precedenza.precedenza.
Vedremo ora il comando Vedremo ora il comando awkawk che e’ un potente programma di text processing la cui che e’ un potente programma di text processing la cui versatilita’ lo avvicina ad un linguaggio ad alto livello. E’ un comando di text processing versatilita’ lo avvicina ad un linguaggio ad alto livello. E’ un comando di text processing line orientedline oriented poiche’ il testo viene analizzato una linea alla volta. Le possibilita’ offerte poiche’ il testo viene analizzato una linea alla volta. Le possibilita’ offerte da da awkawk sono tra l’altro : sono tra l’altro :
Vedremo ora il comando Vedremo ora il comando awkawk che e’ un potente programma di text processing la cui che e’ un potente programma di text processing la cui versatilita’ lo avvicina ad un linguaggio ad alto livello. E’ un comando di text processing versatilita’ lo avvicina ad un linguaggio ad alto livello. E’ un comando di text processing line orientedline oriented poiche’ il testo viene analizzato una linea alla volta. Le possibilita’ offerte poiche’ il testo viene analizzato una linea alla volta. Le possibilita’ offerte da da awkawk sono tra l’altro : sono tra l’altro :
1) field oriented processing1) field oriented processing
2) predefined variables2) predefined variables
3) variable assignment3) variable assignment
4) logical operations4) logical operations
5) arithmetic expressions5) arithmetic expressions
6) scalar variables and arrays6) scalar variables and arrays
7) output redirection and piping7) output redirection and piping
228*
SintassiSintassi ::
awkawk [[-options-options] ] ’’program textprogram text’’ file [file2 … ] file [file2 … ]
dove dove program text program text ha la forma :ha la forma :
pattern {action} ... pattern {action}pattern {action} ... pattern {action}
SintassiSintassi ::
awkawk [[-options-options] ] ’’program textprogram text’’ file [file2 … ] file [file2 … ]
dove dove program text program text ha la forma :ha la forma :
pattern {action} ... pattern {action}pattern {action} ... pattern {action}
Opzione : Opzione : FFdelimiterdelimiter questa opzione specifica che l’ input questa opzione specifica che l’ input field separator field separator
e’ e’ delimiterdelimiter invece che il blank (che e’ il default)invece che il blank (che e’ il default)
f f awk_scriptawk_script specifica che i comandi da eseguire non vengono specifica che i comandi da eseguire non vengono
dati da terminali ma sono contenuti nel file ASCII dati da terminali ma sono contenuti nel file ASCII awk_scriptawk_script
v v varvar==valval viene definita una variabile viene definita una variabile varvar che puo’ essere ‘vista’ che puo’ essere ‘vista’
durante l’esecuzione dei comandi di durante l’esecuzione dei comandi di awkawk. A tale variabile viene anche assegnato . A tale variabile viene anche assegnato
assegnato il valore assegnato il valore valval prima di cominciare ad eseguire le altre operazioni. prima di cominciare ad eseguire le altre operazioni.
Opzione : Opzione : FFdelimiterdelimiter questa opzione specifica che l’ input questa opzione specifica che l’ input field separator field separator
e’ e’ delimiterdelimiter invece che il blank (che e’ il default)invece che il blank (che e’ il default)
f f awk_scriptawk_script specifica che i comandi da eseguire non vengono specifica che i comandi da eseguire non vengono
dati da terminali ma sono contenuti nel file ASCII dati da terminali ma sono contenuti nel file ASCII awk_scriptawk_script
v v varvar==valval viene definita una variabile viene definita una variabile varvar che puo’ essere ‘vista’ che puo’ essere ‘vista’
durante l’esecuzione dei comandi di durante l’esecuzione dei comandi di awkawk. A tale variabile viene anche assegnato . A tale variabile viene anche assegnato
assegnato il valore assegnato il valore valval prima di cominciare ad eseguire le altre operazioni. prima di cominciare ad eseguire le altre operazioni.
Azione : il comando esamina ogni riga di Azione : il comando esamina ogni riga di file file (se ci sono piu’ files in input (se ci sono piu’ files in input
vengono concatenati e visti come un unico grande file), una riga alla volta,vengono concatenati e visti come un unico grande file), una riga alla volta,
la scompone in campi (la scompone in campi (fieldsfields), indidua eventuali ), indidua eventuali patternspatterns, esegue, esegue
eventuali azioni (eventuali azioni (actionsactions).).
Azione : il comando esamina ogni riga di Azione : il comando esamina ogni riga di file file (se ci sono piu’ files in input (se ci sono piu’ files in input
vengono concatenati e visti come un unico grande file), una riga alla volta,vengono concatenati e visti come un unico grande file), una riga alla volta,
la scompone in campi (la scompone in campi (fieldsfields), indidua eventuali ), indidua eventuali patternspatterns, esegue, esegue
eventuali azioni (eventuali azioni (actionsactions).).
229*
Le single quotes ( ’ ) delimitano le combinazioni pattern - action statements ; le parentesigraffe { } isolano le actions dai patterns. Il pattern viene per primo, poi si mette l’action.Sia il pattern che l’action possono non esserci ma, non entrambi.Se il pattern manca, l’action sara’ eseguita per ogni record (cioe’ per ogni riga) di input.Se manca l’action allora viene assunta quella di default che e’ print vale a dire lastampa dell’intera riga di input.Infine in mancanza dell’opzioneF il field delimiter e’ lo spazio (blank).
pattern :il primo campo sia uguale a pippo
pattern :il primo campo sia uguale a pippo
action :stampa a stdout il primo e terzo campo
action :stampa a stdout il primo e terzo campo
230*
9.1 Definizione dei campi con i field separators9.1 Definizione dei campi con i field separators9.1 Definizione dei campi con i field separators9.1 Definizione dei campi con i field separators
Per default il delimitatore di campi (field separator) e’ qualunque un numero di blankstra caratteri non blank. Eventuali blanks all’inizio della riga vengono trascurati.
cat dimostrazione_campi.txt primocampo secondo terzo
field delimiterfield delimiter
primo campoprimo campo
terzo campoterzo campo
secondo camposecondo campo
231*
Si puo’ ridefinire il Si puo’ ridefinire il field separatorfield separator con una qualunque stringa di caratteri, con l’opzione con una qualunque stringa di caratteri, con l’opzioneFF come negli esempi che seguono. A differenza del blank, piu’ field separators di seguito come negli esempi che seguono. A differenza del blank, piu’ field separators di seguitodefiniscono definiscono campi vuoticampi vuoti ed eventuali field separators all’inizio di una riga ed eventuali field separators all’inizio di una riga NONNON vengono vengonotrascurati da trascurati da awkawk..
cat esempio.txt::nome:cognome::via:paeseawk -F: ‘{print $4}’ esempio.txtcognome
primo campo(vuoto)
primo campo(vuoto)
l’action e’ un printsu stdout
l’action e’ un printsu stdout
quarto campoquarto campo
il : e’ il field delimiteril : e’ il field delimiter
232*
il fielddelimiter
e’ :
il fielddelimiter
e’ :
pattern : unoqualunque dei campi
sia uguale a boca
pattern : unoqualunque dei campi
sia uguale a boca
l’action e’ un printdi $0 (tutta la riga)
l’action e’ un printdi $0 (tutta la riga)
delimitatore deicampi pattern-action
delimitatore deicampi pattern-action
file esaminatoda awk
file esaminatoda awk
risultato del comandorisultato del comandorisultato del comandorisultato del comando
233*
BEGINBEGIN esegue dei comandi esegue dei comandi primaprima di esaminare alcunadi esaminare alcuna linea di inputlinea di inputENDEND esegue dei comandi esegue dei comandi dopodopo aver saminato aver saminato tuttetutte le linee le linee di inputdi input//regular expressionregular expression/ / pattern di pattern di matchmatch (con una regular expression) (con una regular expression)relational expressionrelational expression pattern che contiene pattern che contiene relational operator(s)relational operator(s)patternpattern &&&& patternpattern AND AND logico di due patternslogico di due patternspatternpattern || || patternpattern OR OR logico di due patternslogico di due patterns!!patternpattern NOTNOT logico di un pattern logico di un patternpattern1pattern1??pattern2pattern2::pattern3pattern3 questo operatore ternario e’ uguale all’analogo del C.questo operatore ternario e’ uguale all’analogo del C. Se Se pattern1pattern1 e’ vero allora il pattern usato nel test logicoe’ vero allora il pattern usato nel test logico e’ e’ pattern2pattern2, altrimenti e’ , altrimenti e’ pattern3pattern3 pattern1pattern1,, pattern2pattern2 questa forma e’ chiamata questa forma e’ chiamata pattern rangepattern range. Corrisponde. Corrisponde a tutti i recors in input che cominciano con un recorda tutti i recors in input che cominciano con un record che corrisponde a che corrisponde a pattern1pattern1 fino al record che soddisfa fino al record che soddisfa pattern2pattern2, inclusi., inclusi.
Tavola dei patterns di awkTavola dei patterns di awk
9.2 Patterns9.2 Patterns9.2 Patterns9.2 Patterns
Diamo la tavola dei tipi di patterns di awk e, nelle pagine seguenti, numerosi esempi.
234*
prima dell’esame delle righeprima dell’esame delle righedi input viene eseguitadi input viene eseguita
la stampa tra parentesi graffela stampa tra parentesi graffe
prima dell’esame delle righeprima dell’esame delle righedi input viene eseguitadi input viene eseguita
la stampa tra parentesi graffela stampa tra parentesi graffe
backslash prima di return per labackslash prima di return per lacontinuazione del comandocontinuazione del comando
nella prossima riganella prossima riga
backslash prima di return per labackslash prima di return per lacontinuazione del comandocontinuazione del comando
nella prossima riganella prossima riga
operatore aritmetico dioperatore aritmetico diautoincremento comeautoincremento come
quello del Cquello del C
operatore aritmetico dioperatore aritmetico diautoincremento comeautoincremento come
quello del Cquello del C
dopo aver esaminato il dopo aver esaminato il file di input viene eseguitofile di input viene eseguito
lo statement tra parentesi graffelo statement tra parentesi graffe
dopo aver esaminato il dopo aver esaminato il file di input viene eseguitofile di input viene eseguito
lo statement tra parentesi graffelo statement tra parentesi graffe
Patterns contenenti Patterns contenenti BEGINBEGIN od od ENDENDPatterns contenenti Patterns contenenti BEGINBEGIN od od ENDEND
235*
patternpattern : :un campo qualunque sia uguale a un campo qualunque sia uguale a bocaboca
patternpattern : :un campo qualunque sia uguale a un campo qualunque sia uguale a bocaboca
Pattern di match (con una regular expression)Pattern di match (con una regular expression)Pattern di match (con una regular expression)Pattern di match (con una regular expression)
Il pattern di match e’ indicato dalla presenza delle barre in avanti (slash). Il match siverifica quando uno o piu’ campi contengono la stringa di caratteri con cui si fa il match.Quest’ultima e’ appunto quella racchiusa tra barre. Si noti che quest’ultima puo’ esseresia una stringa normale, sia una con i simboli speciali (ad es. il $ ed il ^) che si possonousare con il comando grep, con significato analogo. In UNIX sia le stringhe normali chequelle con simboli speciali vengono chiamate regular expressions.
action statementaction statement : :printprint da solo, cioe’ print di tutta la riga da solo, cioe’ print di tutta la riga
action statementaction statement : :printprint da solo, cioe’ print di tutta la riga da solo, cioe’ print di tutta la riga
l’output del comandol’output del comandoawk awk e’ il printout die’ il printout ditutte le righe del filetutte le righe del file
/etc/passwd/etc/passwd che abbiano che abbianoun qualunque campoun qualunque campo
uguale a uguale a bocaboca
l’output del comandol’output del comandoawk awk e’ il printout die’ il printout ditutte le righe del filetutte le righe del file
/etc/passwd/etc/passwd che abbiano che abbianoun qualunque campoun qualunque campo
uguale a uguale a bocaboca
236*
Pattern di match (con una regular expression)Pattern di match (con una regular expression)Pattern di match (con una regular expression)Pattern di match (con una regular expression)
Il pattern di match e’ indicato dalla presenza delle barre in avanti (slash). Il match siverifica quando uno o piu’ campi contengono la stringa di caratteri con cui si fa il match.Quest’ultima e’ appunto quella racchiusa tra barre. Si noti che quest’ultima puo’ esseresia una stringa normale, sia una con i simboli speciali (ad es. il $ ed il ^) che si possonousare con il comando grep, con significato analogo. In UNIX sia le stringhe normali chequelle con simboli speciali vengono chiamate regular expressions.
patternpattern : :un campo qualunque sia uguale alla un campo qualunque sia uguale alla regular expressionregular expression ^b ^b
(che vuol dire una stringa di caratteri che inizi con (che vuol dire una stringa di caratteri che inizi con b b ))
patternpattern : :un campo qualunque sia uguale alla un campo qualunque sia uguale alla regular expressionregular expression ^b ^b
(che vuol dire una stringa di caratteri che inizi con (che vuol dire una stringa di caratteri che inizi con b b ))
l’output del comandol’output del comandoawk awk e’ il printout die’ il printout di
tutte le righe che hannotutte le righe che hannoqualche campo chequalche campo che
comincia percomincia per b b
l’output del comandol’output del comandoawk awk e’ il printout die’ il printout di
tutte le righe che hannotutte le righe che hannoqualche campo chequalche campo che
comincia percomincia per b b
237*
Pattern di match (con una regular expression)Pattern di match (con una regular expression)Pattern di match (con una regular expression)Pattern di match (con una regular expression)
Il pattern di match e’ indicato dalla presenza delle barre in avanti (slash). Il match siverifica quando uno o piu’ campi contengono la stringa di caratteri con cui si fa il match.Quest’ultima e’ appunto quella racchiusa tra barre. Si noti che quest’ultima puo’ esseresia una stringa normale, sia una con i simboli speciali (ad es. il $ ed il ^) che si possonousare con il comando grep, con significato analogo. In UNIX sia le stringhe normali chequelle con simboli speciali vengono chiamate regular expressions.
action mancante, significa action mancante, significa print print ;;l’output del comandol’output del comandoawk awk e’ il printout die’ il printout di
tutte le righe che hannotutte le righe che hannoil primo campo cheil primo campo che
comincia percomincia per g g
action mancante, significa action mancante, significa print print ;;l’output del comandol’output del comandoawk awk e’ il printout die’ il printout di
tutte le righe che hannotutte le righe che hannoil primo campo cheil primo campo che
comincia percomincia per g g
patternpattern : :il primo campo sia uguale alla il primo campo sia uguale alla regular expressionregular expression ^g ^g
( stringa di caratteri che inizi con ( stringa di caratteri che inizi con g g ))
patternpattern : :il primo campo sia uguale alla il primo campo sia uguale alla regular expressionregular expression ^g ^g
( stringa di caratteri che inizi con ( stringa di caratteri che inizi con g g ))
238*
Pattern di match (con una regular expression)Pattern di match (con una regular expression)Pattern di match (con una regular expression)Pattern di match (con una regular expression)
Il pattern di match e’ indicato dalla presenza delle barre in avanti (slash). Il match siverifica quando uno o piu’ campi contengono la stringa di caratteri con cui si fa il match.Quest’ultima e’ appunto quella racchiusa tra barre. Si noti che quest’ultima puo’ esseresia una stringa normale, sia una con i simboli speciali (ad es. il $ ed il ^) che si possonousare con il comando grep, con significato analogo. In UNIX sia le stringhe normali chequelle con simboli speciali vengono chiamate regular expressions.
l’output del comandol’output del comandoawk awk e’ il printout die’ il printout di
tutte le righe che hannotutte le righe che hannoqualunque campo chequalunque campo che
termina pertermina per tcsh tcsh
l’output del comandol’output del comandoawk awk e’ il printout die’ il printout di
tutte le righe che hannotutte le righe che hannoqualunque campo chequalunque campo che
termina pertermina per tcsh tcsh
patternpattern : :qualunque campo sia uguale alla qualunque campo sia uguale alla regular expressionregular expression tcsh$ tcsh$
che vuol dire stringa di caratteri che finisca con che vuol dire stringa di caratteri che finisca con tcshtcsh
patternpattern : :qualunque campo sia uguale alla qualunque campo sia uguale alla regular expressionregular expression tcsh$ tcsh$
che vuol dire stringa di caratteri che finisca con che vuol dire stringa di caratteri che finisca con tcshtcsh
239*
ANDAND logico dei due patterns logico dei due patternsANDAND logico dei due patterns logico dei due patterns
operatore matematicooperatore matematicooperatore matematicooperatore matematicooperatore relazionaleoperatore relazionale < <operatore relazionaleoperatore relazionale < <
actionactionactionactionAltri esempi di patternsAltri esempi di patternsAltri esempi di patternsAltri esempi di patterns
240*
se il 3se il 300 campo e’ < campo e’ < 00000000allora il 3allora il 300 campo sia < campo sia <2020
altrimenti il 4altrimenti il 400 campo sia < campo sia < 2020
se il 3se il 300 campo e’ < campo e’ < 00000000allora il 3allora il 300 campo sia < campo sia <2020
altrimenti il 4altrimenti il 400 campo sia < campo sia < 2020
corrisponde ai records (linee)corrisponde ai records (linee)cominciando da quello che contienecominciando da quello che contieneil pattern il pattern halt halt a quello che contiene a quello che contiene
il pattern il pattern opeope all’inizio della riga. all’inizio della riga.L’action non e’ indicata, quindi e’L’action non e’ indicata, quindi e’
quella di default : quella di default : print $0print $0
corrisponde ai records (linee)corrisponde ai records (linee)cominciando da quello che contienecominciando da quello che contieneil pattern il pattern halt halt a quello che contiene a quello che contiene
il pattern il pattern opeope all’inizio della riga. all’inizio della riga.L’action non e’ indicata, quindi e’L’action non e’ indicata, quindi e’
quella di default : quella di default : print $0print $0
Altri esempi di patternsAltri esempi di patternsAltri esempi di patternsAltri esempi di patterns
241*
NOTNOT logico (negazione) logico (negazione)NOTNOT logico (negazione) logico (negazione)Altri esempi di patternsAltri esempi di patternsAltri esempi di patternsAltri esempi di patterns
242*
9.3 Actions9.3 Actions9.3 Actions9.3 Actions
Come gia’ detto, le actions sono racchiuse tra parentesi graffe. Gli statements che formanouna action sono uguali a quelle disponibile nel linguaggio C. Il numero ed il tipo di actionspossedute da awk lo avvicinano molto ad un vero e proprio linguaggio ad alto livello.Nel seguito, ciascuna categoria di action verra’ spiegata mediante un esempio.
Tipi di action statementsTipi di action statements
1) Variable assignment1) Variable assignment2) Formatted printing, I/O statements, output redirecting2) Formatted printing, I/O statements, output redirecting3) Mathematical and logiacal operators, string and mathematical3) Mathematical and logiacal operators, string and mathematical functionsfunctions4) Conditional, flow control and looping statements4) Conditional, flow control and looping statements
243*
Variable assignmentVariable assignmentVariable assignmentVariable assignment
In awk si possono definire delle variabili che possono essere scalari oppure anche vettori
ad una dimensione. Esistono anche delle variabili predefinite. Le variabili sono dinamiche,cioe’ vengono create quando vengono usate per la prima volta. Inoltre, a differenza diquanto succede in molti linguaggi di alto livello, NON occorre dichiarare prima il tipo divariabile. I valori che possono assumere le variabili possono essere floating point, interi,stringhe di caratteri in dipendenza da come vengono usate. L’utente assegna valori allevariabili mediante l’uguale ( = ).
Non c’e’ bisogno cheNon c’e’ bisogno chela variabile la variabile xx sia sia
stata definita primastata definita prima
Non c’e’ bisogno cheNon c’e’ bisogno chela variabile la variabile xx sia sia
stata definita primastata definita prima
La variabile La variabile xx puo’ assumere puo’ assumerevalori sia interi chevalori sia interi che
alfanumerici (stringa di caratteri)alfanumerici (stringa di caratteri)
La variabile La variabile xx puo’ assumere puo’ assumerevalori sia interi chevalori sia interi che
alfanumerici (stringa di caratteri)alfanumerici (stringa di caratteri)
;; separatore separatoredi comandidi comandi(come in C(come in C
e nella C shell)e nella C shell)
;; separatore separatoredi comandidi comandi(come in C(come in C
e nella C shell)e nella C shell)
244*
Tavola delle variabili predefiniteTavola delle variabili predefinite
Come detto prima, awk ha un set di varibili predefinite (built-in variables)che l’utentepuo’ usare in qualunque punto del suo script ; sono riassunte nella tavola che segue.
ARGC ARGC il numero di argomenti dati nella linea di comando di il numero di argomenti dati nella linea di comando di awkawk, ad, ad esclusione delle opzioni e dell’input file.esclusione delle opzioni e dell’input file.ARGIND ARGIND l’indice in l’indice in ARGV ARGV del file correntemente esaminato.del file correntemente esaminato.ARGV ARGV array degli argomenti dati nella linea di comando di array degli argomenti dati nella linea di comando di awkawk. L’array e’. L’array e’ numerato da numerato da 0 0 ad ad ARGCARGC11. Modificando dinamicamente . Modificando dinamicamente ARGVARGV si possono controllare i files di dati in input.si possono controllare i files di dati in input.CONVFMT CONVFMT il formato di conversione per i numeri che per default e’ il formato di conversione per i numeri che per default e’ “%.6g”“%.6g”ENVIRON ENVIRON e’ l’array contenente i valori correnti delle e’ l’array contenente i valori correnti delle environment variablesenvironment variables.. Questo array e’ indicizzato dal nome della variabile d’ambiente eQuesto array e’ indicizzato dal nome della variabile d’ambiente e ciascun elemento e’ il valore di tale variabile. Ad esempio,ciascun elemento e’ il valore di tale variabile. Ad esempio, ENVIRON[“HOME”]ENVIRON[“HOME”] potrebbe essere potrebbe essere /home/studente/home/studente (vedi anche (vedi anche seguitoseguito la sintassi degli arrays). Da notare che se si cambia questola sintassi degli arrays). Da notare che se si cambia questo array all’interno di awk array all’interno di awk NONNON cambia il set di variabili d’ambiente cambia il set di variabili d’ambiente visto da programmi fatti partire da awk mediante redirection ovisto da programmi fatti partire da awk mediante redirection o dall’uso della funzione dall’uso della funzione systemsystem..
Variabili predefiniteVariabili predefiniteVariabili predefiniteVariabili predefinite
245*
Tavola delle variabili predefiniteTavola delle variabili predefinite
Come detto prima, awk ha un set di varibili predefinite (built-in variables)che l’utentepuo’ usare in qualunque punto del suo script ; sono riassunte nella tavola che segue.
ERRNO ERRNO se c’e’ un errore di sistema durante la ridirezionamento con lase c’e’ un errore di sistema durante la ridirezionamento con la la funzione la funzione getlinegetline o durante un read con o durante un read con getlinegetline e durante una e durante una closeclose allora allora ERRNOERRNO conterra’ una stringa che descrive l’errore. conterra’ una stringa che descrive l’errore.FILENAME FILENAME il nome del file di input corrente.il nome del file di input corrente.FNR FNR l’input record number nel file di input corrente.l’input record number nel file di input corrente.FS FS l’input field separator (uno spazio per default).l’input field separator (uno spazio per default).IGNORECASE IGNORECASE controlla la case-sensitivity di tutte le regular expressions e lecontrolla la case-sensitivity di tutte le regular expressions e le operazioni con stringhe. Se esso ha un valore diverso da operazioni con stringhe. Se esso ha un valore diverso da 00, allora, allora tutte le operazioni che coinvolgono pattern matching, regulartutte le operazioni che coinvolgono pattern matching, regular expressions etc. non fanno differenza tra maiuscole e minuscole. Adexpressions etc. non fanno differenza tra maiuscole e minuscole. Ad es. es. /aB//aB/ corrisponde alle stringhe corrisponde alle stringhe “ab”“ab”, , “aB”“aB”,, “Ab” “Ab” e e “AB”“AB”..NF NF il numero di campi della riga correnteil numero di campi della riga correnteNR NR numero totale di numero totale di input recordsinput records (cioe’ righe di input) viste finora. (cioe’ righe di input) viste finora.
Variabili predefiniteVariabili predefiniteVariabili predefiniteVariabili predefinite
246*
Tavola delle variabili predefiniteTavola delle variabili predefinite
Come detto prima, awk ha un set di varibili predefinite (built-in variables)che l’utentepuo’ usare in qualunque punto del suo script ; sono riassunte nella tavola che segue.
OFMT OFMT il formato di output per i numeri, per default il formato di output per i numeri, per default “%.6g”“%.6g”. Modificando. Modificando questa variabile si puo’ modificare l’output del comando print questa variabile si puo’ modificare l’output del comando print NONNON formattato; vedi in seguito nella sezione sull’ formattato; vedi in seguito nella sezione sull’ I/OI/O..OFS OFS l’ l’ output field separatoroutput field separator, uno spazio per default., uno spazio per default.ORS ORS l’ l’ output record separatoroutput record separator; per default e’ un ; per default e’ un newlinenewline..RS RS l’l’ nput record separator nput record separator; per default e’ un ; per default e’ un newlinenewline..RSTART RSTART l’indice del primo carattere corrispondente ai criteri della funzionel’indice del primo carattere corrispondente ai criteri della funzione match( )match( ) ; ; 0 0 se non ce n’e’ nessuno.se non ce n’e’ nessuno.RLENGTH RLENGTH la lunghezza della stringa individuata da la lunghezza della stringa individuata da match( )match( ) ; ;11 se non ce n’e’ se non ce n’e’ alcuna.alcuna.SUBSEP SUBSEP il carattere usato per separare gli indici ‘multipli’ negli arrays, peril carattere usato per separare gli indici ‘multipli’ negli arrays, per default e’ default e’ “\034”“\034” (cioe’ il carattere ASCII corrispondente al numero (cioe’ il carattere ASCII corrispondente al numero ottale ottale 34 34 ( ( CC in esadecimale) ; vedi seguito nella sezione dedicata in esadecimale) ; vedi seguito nella sezione dedicata agli arrays).agli arrays).
Variabili predefiniteVariabili predefiniteVariabili predefiniteVariabili predefinite
247*
Tavola delle variabili predefiniteTavola delle variabili predefinite
Come detto prima, awk ha un set di varibili predefinite (built-in variables)che l’utentepuo’ usare in qualunque punto del suo script ; sono riassunte nella tavola che segue.
$0 $0 tutto il record ( tutta la riga ) correntetutto il record ( tutta la riga ) corrente$$nn il field il field nnesimoesimo del record corrente del record correntelength(length(varvar) ) lunghezza (in caratteri) del contenuto di lunghezza (in caratteri) del contenuto di varvar
Variabili predefiniteVariabili predefiniteVariabili predefiniteVariabili predefinite
248*
Come gia’ detto, in awk si possono definire delle variabili anche vettori. Tali arraysvengono indicati, come in C, con un nome seguito da parentesi quadre ( [ ] ). Non e’necessario dichiararne il tipo prima poiche’ vengono creati al momento dell’uso. La lorodimensione e’ solo . Tuttavia se ne puo’ sfruttare una notevole particolarita’, vale a direche l’indice dei vettori e’ una stringa di caratteri (proprieta’ associativa dell’indice delvettore ) per simulare arrays a piu’ dimensioni.
Il vettore Il vettore vv ha indici ha indicialfanumerici ( alfanumerici ( hash tablehash table ) )
Il vettore Il vettore vv ha indici ha indicialfanumerici ( alfanumerici ( hash tablehash table ) )
VettoriVettoriVettoriVettori
249*
Infatti, se il vettore viene indicizzato con una lista di espressioni :expr1, expr2,expr3 …allora l’indice del vettore diventa la stringa risultato della concatenazione dei valori (comestringhe) di ciascuna espressione, separate dal valore della variabile SUBSEP (vedi tavolaprecedente delle variabili predefinite). In tal modo e’ possibile simulare la presenza di piu’indici per il vettore.
Il vettore Il vettore vv ha un ha un UNICOUNICO indice dato dalla indice dato dalla concatenazione dei valori concatenazione dei valori A B CA B C separati tra loro separati tra loro dal separatore dal separatore \034 \034 (cioe’ dal valore contenuto in (cioe’ dal valore contenuto in SUBSEPSUBSEP))
Il vettore Il vettore vv ha un ha un UNICOUNICO indice dato dalla indice dato dalla concatenazione dei valori concatenazione dei valori A B CA B C separati tra loro separati tra loro dal separatore dal separatore \034 \034 (cioe’ dal valore contenuto in (cioe’ dal valore contenuto in SUBSEPSUBSEP))
Il vettore Il vettore vecvec ha un ha un UNICOUNICO indice dato dalla indice dato dalla concatenazione dei valori concatenazione dei valori 3 1 53 1 5 separati tra loro separati tra loro dal separatore dal separatore \034 \034 (cioe’ dal valore di (cioe’ dal valore di SUBSEPSUBSEP). ). Cosi’ il riferimento al vettore Cosi’ il riferimento al vettore vecvec nello statement nello statement printprint e’ e’ formalmente formalmente identico a quello di un vero identico a quello di un vero vettore multidimensionalevettore multidimensionale
Il vettore Il vettore vecvec ha un ha un UNICOUNICO indice dato dalla indice dato dalla concatenazione dei valori concatenazione dei valori 3 1 53 1 5 separati tra loro separati tra loro dal separatore dal separatore \034 \034 (cioe’ dal valore di (cioe’ dal valore di SUBSEPSUBSEP). ). Cosi’ il riferimento al vettore Cosi’ il riferimento al vettore vecvec nello statement nello statement printprint e’ e’ formalmente formalmente identico a quello di un vero identico a quello di un vero vettore multidimensionalevettore multidimensionale
VettoriVettoriVettoriVettori
Come gia’ detto, in awk si possono definire delle variabili anche vettori. Tali arraysvengono indicati, come in C, con un nome seguito da parentesi quadre ( [ ] ). Non e’necessario dichiararne il tipo prima poiche’ vengono creati al momento dell’uso. La lorodimensione e’ solo . Tuttavia se ne puo’ sfruttare una notevole particolarita’, vale a direche l’indice dei vettori e’ una stringa di caratteri (proprieta’ associativa dell’indice delvettore ) per simulare arrays a piu’ dimensioni.
250*
VettoriVettoriVettoriVettori
Esiste in awk l’operatore in che serve per determinare se un valore e’ un possibile indicedi un vettore.
Valori possibili dell’indice di vecsono e 3
Valori possibili dell’indice di vecsono e 3
operatore in che restituisce un valore(true o false ) che e’ possibile usare in uno
statement logico (if in questo esempio)
operatore in che restituisce un valore(true o false ) che e’ possibile usare in uno
statement logico (if in questo esempio)
251*
Formatted printing, I/O statements,Formatted printing, I/O statements,output redirectingoutput redirectingFormatted printing, I/O statements,Formatted printing, I/O statements,output redirectingoutput redirecting
Il printout a stdout si ottiene con lo statement print come abbiamo gia’ visto in numerosi
esempi precedenti. Si noti che print e’ anche l’action di default nel caso l’utente non neindichi esplicitamente di proprie. Nel caso invece si voglia formattare l’output si puo’ usare,in modo del tutto analogo al C, lo statement printf.
SintassiSintassi ::
{{ printf “printf “format statementformat statement”” expression expression }}
dove dove program text program text ha la forma :ha la forma :
pattern {action} ... pattern {action}pattern {action} ... pattern {action}
SintassiSintassi ::
{{ printf “printf “format statementformat statement”” expression expression }}
dove dove program text program text ha la forma :ha la forma :
pattern {action} ... pattern {action}pattern {action} ... pattern {action}
{ printf “%8.2f”,i }{ printf “variabile intera %10d\n”,i }{ printf “formato variabile %10.6g\n”,i}
{ printf “%8.2f”,i }{ printf “variabile intera %10d\n”,i }{ printf “formato variabile %10.6g\n”,i}
printout di variabile floating point, in un campoprintout di variabile floating point, in un campoda 8 cifre con 2 cifre decimalida 8 cifre con 2 cifre decimali
printout di variabile floating point, in un campoprintout di variabile floating point, in un campoda 8 cifre con 2 cifre decimalida 8 cifre con 2 cifre decimali
printout di variabile intera in campo di printout di variabile intera in campo di cifre cifreprintout di variabile intera in campo di printout di variabile intera in campo di cifre cifre
printout di variabile con formato variabileprintout di variabile con formato variabilein campo diin campo dicifre con 2 cifre significative cifre con 2 cifre significative
printout di variabile con formato variabileprintout di variabile con formato variabilein campo diin campo dicifre con 2 cifre significative cifre con 2 cifre significative
252*
action :printout delle variabilii e $ con un campo di5 interi e come stringa
rispettivamente
action :printout delle variabilii e $ con un campo di5 interi e come stringa
rispettivamente
253*
In In awkawk e’ possibile ridirigere l’output, normalmente diretto a e’ possibile ridirigere l’output, normalmente diretto a stdoutstdout, ad un file, ad un fileoppure ad un altro comando con un piping.oppure ad un altro comando con un piping.
In In awkawk e’ possibile ridirigere l’output, normalmente diretto a e’ possibile ridirigere l’output, normalmente diretto a stdoutstdout, ad un file, ad un fileoppure ad un altro comando con un piping.oppure ad un altro comando con un piping.
> > : ridirezione dell’output da : ridirezione dell’output da stdoutstdout a a users_file.lisusers_file.lis> > : ridirezione dell’output da : ridirezione dell’output da stdoutstdout a a users_file.lisusers_file.lis
>> >> : ridirezione dell’output da : ridirezione dell’output da stdoutstdouta a users_file.lisusers_file.lis
>> >> : ridirezione dell’output da : ridirezione dell’output da stdoutstdouta a users_file.lisusers_file.lis
piping dell’output di awk al comandohead3
piping dell’output di awk al comandohead3
254*
Esistono anche altri statements che riguardano l’ Esistono anche altri statements che riguardano l’ I/OI/O; sono riassunti nella tavola seguente ; sono riassunti nella tavola seguente Esistono anche altri statements che riguardano l’ Esistono anche altri statements che riguardano l’ I/OI/O; sono riassunti nella tavola seguente ; sono riassunti nella tavola seguente
Tavola degli statements di Input/OutputTavola degli statements di Input/Outputclose(close(filefile)) close file or pipeclose file or pipegetline getline set set $0$0 equal to the next input line; set equal to the next input line; set NFNF, , NRNR, , FNRFNRgetline <getline < file file set set $0$0 equal to the next input line of equal to the next input line of filefile ; set ; set NFNFgetline getline var var set set varvar equal to the next input line; set equal to the next input line; set NRNR, , FNRFNR getline getline var var << file file set set varvar equal to the next input line of equal to the next input line of filefilenext next stop processing the current input record. The next input record stop processing the current input record. The next input record is read and processing starts over with the first pattern in theis read and processing starts over with the first pattern in the awkawk program. If the end of the input is reached, the program. If the end of the input is reached, the ENDEND block(s), if any, are executed.block(s), if any, are executed.nextfile nextfile stop processing the current input record. The next input recordstop processing the current input record. The next input record read comes from the next input file. read comes from the next input file. FILENAMEFILENAME and and ARGINDARGIND are updated, are updated, FNRFNR is reset to is reset to and processing starts over with the and processing starts over with the first pattern in the first pattern in the awkawk program. If the end of the input data is program. If the end of the input data is reached, the reached, the ENDEND block(s), if any, are executed. block(s), if any, are executed.
255*
Esistono anche altri statements che riguardano l’ Esistono anche altri statements che riguardano l’ I/OI/O; sono riassunti nella tavola seguente ; sono riassunti nella tavola seguente Esistono anche altri statements che riguardano l’ Esistono anche altri statements che riguardano l’ I/OI/O; sono riassunti nella tavola seguente ; sono riassunti nella tavola seguente
Tavola degli statements di Input/OutputTavola degli statements di Input/Outputfflush(fflush([file][file])) flush any buffers associated with the open output file or pipeflush any buffers associated with the open output file or pipe filefile . If . If filefile is missing, then is missing, then stdoutstdout is flushed. If is flushed. If file file is the is the NULLNULL string, then all open output files and pipes have their buffersstring, then all open output files and pipes have their buffers flushed.flushed.system(system(command linecommand line) ) executes executes command linecommand line and returns the status. The and returns the status. The command is executed in the Bash shell (command is executed in the Bash shell (shsh).).
256*
action action ::quando quando NRNR
(numero di records)(numero di records)e’ uguale a 3e’ uguale a 3
action action ::quando quando NRNR
(numero di records)(numero di records)e’ uguale a 3e’ uguale a 3
salta un record esalta un record eponi il prossimoponi il prossimo
input record in input record in $0$0
salta un record esalta un record eponi il prossimoponi il prossimo
input record in input record in $0$0
non ha stampato lanon ha stampato laterza riga perche’terza riga perche’
l’ha saltata con l’ha saltata con nextnext
non ha stampato lanon ha stampato laterza riga perche’terza riga perche’
l’ha saltata con l’ha saltata con nextnext
257*
pattern pattern ::NRNR sia sia <= 3<= 3
pattern pattern ::NRNR sia sia <= 3<= 3
esegue il comando di (Bash) shell esegue il comando di (Bash) shell datedate esegue il comando di (Bash) shell esegue il comando di (Bash) shell datedate
258*
Operatori matematici e logiciOperatori matematici e logiciOperatori matematici e logiciOperatori matematici e logici
Vengono di seguito elencati nella tavola gli operatori matematici e logici disponibili in
awk in ordine di priorita’ decrescente (gli operatori in cima all’elenco vengono eseguitiper primi, quelli sulla stessa riga hanno la stessa priorita’ e vengono eseguiti da sinistra adestra). Si nota una volta di piu’, che sono uguali agli operatori del C ; hanno anchela stessa sintassi.
( ) ( ) parenthesisparenthesis$ $ field reference field reference++++ increment and decremet, both prefix and postfixincrement and decremet, both prefix and postfix^ ^ exponentiation (alsoexponentiation (also ))++ ! ! unary plus, unary minus, negate value of expressionunary plus, unary minus, negate value of expression * / % * / % multiply, divide and remainder (modulo)multiply, divide and remainder (modulo)+ + addition andaddition and subtractionsubtractionspacespace string concatenation string concatenation< > < > less than, greater than less than, greater than
Tavola degli operatori matematici e logiciTavola degli operatori matematici e logici
259*
Operatori matematici e logiciOperatori matematici e logiciOperatori matematici e logiciOperatori matematici e logici
<= >= <= >= less than or equal to, less than or equal to, greater than or equal togreater than or equal to!= == != == not similar to, similar tonot similar to, similar to~ !~ ~ !~ match ( for example, match ( for example, $2$2~/~/AA||||BB||||CC// ), ), no match ( for example, no match ( for example, $2$2!~/!~/AA||||BB||||CC// ) )in in array membershiparray membership&& && Boolean ANDBoolean AND|| || Boolean ORBoolean OR?: ?: the C conditional expressionthe C conditional expression= += = += = = = /= %= ^= = /= %= ^= assignments assignments
Tavola degli operatori matematici e logiciTavola degli operatori matematici e logici
Vengono di seguito elencati nella tavola gli operatori matematici e logici disponibili in
awk in ordine di priorita’ decrescente (gli operatori in cima all’elenco vengono eseguitiper primi, quelli sulla stessa riga hanno la stessa priorita’ e vengono eseguiti da sinistra adestra). Si nota una volta di piu’, che sono uguali agli operatori del C ; hanno anchela stessa sintassi.
260*
pattern pattern ::quandoquando NR NR e’ uguale a e’ uguale a 5 5
pattern pattern ::quandoquando NR NR e’ uguale a e’ uguale a 5 5
elevamento alla 4elevamento alla 4aa potenza potenzaelevamento alla 4elevamento alla 4aa potenza potenzail resto di il resto di $4$4 / 3 / 3il resto di il resto di $4$4 / 3 / 3autoincremento di 1autoincremento di 1autoincremento di 1autoincremento di 1
261*
String functionsString functionsString functionsString functions
gensub(gensub(rr , , s s , , hh , , [, t ][, t ] ) ) search the stringsearch the string t t for matches of the regular expression for matches of the regular expression r r . If h is a string beginning with . If h is a string beginning with gg or or GG, then replace, then replace all matches ofall matches of r r with with ss. Otherwise, . Otherwise, hh is a number is a number indicating which match of indicating which match of rr to replace.If no to replace.If no t t is suppliedis supplied $0$0 is used insted. is used insted.gsub(gsub(rr , , s s , , [, t ][, t ] ) ) for each substring matching the regular expression for each substring matching the regular expression rr in in the stringthe string t t , substitute the string , substitute the string s s , and return the, and return the number of substitutions. Ifnumber of substitutions. If t t is not supplied, use is not supplied, use $0$0 . .index(index(stringstring, , substringsubstring) ) starting position of starting position of stringstring in in substringsubstring;; if not found returns 0if not found returns 0length(length(stringstring) ) length of length of stringstringmatch (match (s s , , rr ) ) returns the position in returns the position in ss where the regular expression where the regular expression r r occurs, or 0 ifoccurs, or 0 if r r is not present, and sets the values ofis not present, and sets the values of RSTARTRSTART and and RLENGTHRLENGTH
Tavola degli string operatorsTavola degli string operators
Il comando awk possiede anche una notevole varieta’ di funzioni che manipolano le
stringhe di caratteri.
262*
String functionsString functionsString functionsString functions
sprintf(sprintf(fmt fmt , , expr-listexpr-list) ) prints prints expr-listexpr-list according to according to fmtfmt and returns the resulting and returns the resulting string string split(split(stringstring, , arrayarray, , ““separatorseparator””) ) separates separates stringstring into elements of into elements of arrayarray according to the according to the field field separatorseparatorsub(sub(rr , , s s , , [, t ][, t ] ) ) just like just like gsub( )gsub( ) but only the first matching substring is replaced but only the first matching substring is replacedsubstr(substr(stringstring, , positionposition, , lengthlength) ) substring of substring of stringstring , starting at , starting at positionposition , and , and lengthlength characters longcharacters longtolower( tolower( stringstring ) ) returns a copy of the string returns a copy of the string stringstring with all the upper-case with all the upper-case characters in characters in stringstring translated to their corresponding translated to their corresponding lower-case counterparts. Non-alphabetic characters arelower-case counterparts. Non-alphabetic characters are left unchanged.left unchanged.toupper ( toupper ( stringstring ) ) returns a copy of the string returns a copy of the string stringstring with all the lower-case with all the lower-case characters in characters in stringstring translated to their corresponding translated to their corresponding upper-case counterparts. Non-alphabetic characters areupper-case counterparts. Non-alphabetic characters are left unchanged.left unchanged.
Tavola degli string operatorsTavola degli string operators
Il comando awk possiede anche una notevole varieta’ di funzioni che manipolano le
stringhe di caratteri.
263*
inizializza lainizializza lavariabile variabile ncnc a 0 a 0
inizializza lainizializza lavariabile variabile ncnc a 0 a 0
action action ::incrementa la variabileincrementa la variabile nc nc della lunghezza della lunghezza
(numero di caratteri) di ciascuna linea di input(numero di caratteri) di ciascuna linea di input
action action ::incrementa la variabileincrementa la variabile nc nc della lunghezza della lunghezza
(numero di caratteri) di ciascuna linea di input(numero di caratteri) di ciascuna linea di input
action action ::splitting del 4splitting del 400 campo del record campo del record
di input, secondo il field separatordi input, secondo il field separator : : e creazione del vettore e creazione del vettore time time concondentro il risultato dello splittingdentro il risultato dello splitting
action action ::splitting del 4splitting del 400 campo del record campo del record
di input, secondo il field separatordi input, secondo il field separator : : e creazione del vettore e creazione del vettore time time concondentro il risultato dello splittingdentro il risultato dello splitting
action action ::printout degliprintout degli
elementi del vettoreelementi del vettoretimetime
action action ::printout degliprintout degli
elementi del vettoreelementi del vettoretimetime
264*
solo un solo un BEGINBEGIN ed un ed un ENDENDin questo awk script; in praticain questo awk script; in pratica
il file di input e’ irrilevanteil file di input e’ irrilevante
solo un solo un BEGINBEGIN ed un ed un ENDENDin questo awk script; in praticain questo awk script; in pratica
il file di input e’ irrilevanteil file di input e’ irrilevante
265*
Mathematical functionsMathematical functionsMathematical functionsMathematical functions
atan2(atan2(y y , , xx) ) preturns the arctang of preturns the arctang of y y //x x in radiansin radianscos(cos(exprexpr) ) returns cosine of returns cosine of exprexpr (which is in radians) (which is in radians)exp(exp(exprexpr) ) exponential functionexponential functionint(int(exprexpr) ) truncates to integertruncates to integerlog(log(exprexpr) ) natural logarithmnatural logarithmrand ( ) rand ( ) returns a andom number between 0 and 1returns a andom number between 0 and 1sin(sin(exprexpr) ) returns sine of returns sine of exprexpr (which is in radians) (which is in radians)sqrt(sqrt(exprexpr) ) returns the square root functionreturns the square root functionsrand(srand(exprexpr) ) uses uses exprexpr as a new seed for the random number generator as a new seed for the random number generator
Tavola delle funzioni matematicheTavola delle funzioni matematiche
La tabella che segue mostra le funzioni matematiche disponibili con awk.
266*
pattern pattern ::NRNR
minore diminore di
pattern pattern ::NRNR
minore diminore diaction action ::
calcolo di calcolo di sqrt(NR)sqrt(NR) e e log(NR)log(NR)
action action ::calcolo di calcolo di sqrt(NR)sqrt(NR) e e log(NR)log(NR)
267*
Conditional, flow control and looping statementsConditional, flow control and looping statementsConditional, flow control and looping statementsConditional, flow control and looping statements
if(if(conditioncondition) ) statement statement [[ else else statementstatement ] ]while (while (conditioncondition) ) statementstatement do do statement statement while while conditioncondition for(for(expr1 expr1 ; ; expr2 expr2 ;; expr3 expr3 ) ) statementstatement for( for( varvar in in array array ))breakbreakcontinuecontinueexit exit [[ expressionexpression ] ] { { statements statements }}
Tavola dei conditional, flowTavola dei conditional, flowcontrol e looping statements control e looping statements
Sono uguali a quelli del linguaggio C.
268*
269*
action action ::test del loop test del loop whilewhile
action action ::test del loop test del loop whilewhile
action action ::loop loop whilewhile
action action ::loop loop whilewhile
270*
loop loop forfor con la stessa sintassi del C con la stessa sintassi del Cloop loop forfor con la stessa sintassi del C con la stessa sintassi del C
# esempio 1 for (x = 1; x<=NF; x++) { print $x }…# esempio 2 for (x in test;) {print x, test[x] }…# esempio 3for (x = 1; x<=NF; x++) { if( $x == “halt”) break }...# esempio 4for (x = 1; x<=NF; x++) { if( $x == “end”) continue }
print del print del contenutocontenuto della variabile della variabilexx (cioe’ (cioe’ $ $, , $2$2, , $3$3 .. etc.) .. etc.)
print del print del contenutocontenuto della variabile della variabilexx (cioe’ (cioe’ $ $, , $2$2, , $3$3 .. etc.) .. etc.)
loop loop forfor con l’uso dell’operatore con l’uso dell’operatore ininloop loop forfor con l’uso dell’operatore con l’uso dell’operatore inin
salta fuori dal loopsalta fuori dal loope continua con glie continua con gli
statements seguentistatements seguenti
salta fuori dal loopsalta fuori dal loope continua con glie continua con gli
statements seguentistatements seguenti
forza l’esecuzione del prossimo ciclo del loop (aforza l’esecuzione del prossimo ciclo del loop (apartire dall’inizio del loop)partire dall’inizio del loop)
abbandonando l’esecuzione di quello correnteabbandonando l’esecuzione di quello corrente
forza l’esecuzione del prossimo ciclo del loop (aforza l’esecuzione del prossimo ciclo del loop (apartire dall’inizio del loop)partire dall’inizio del loop)
abbandonando l’esecuzione di quello correnteabbandonando l’esecuzione di quello corrente
271*
# esempio 1 for (x = 1; x<=NF; x++) { print $x }…# esempio 2 for (x in test;) {print x, test[x] }…# esempio 3for (x = 1; x<=NF; x++) { if( $x == “halt”) break }...# esempio 4for (x = 1; x<=NF; x++) { if( $x == “end”) continue } …# esempio 5for (x = 1; x<=NF; x++) { incr += 1 ; if (incr > 100) exit }...# esempio 6{ for (x = 1; x<=NF; x++) if( NF < 4) getline }...# esempio 7{ for (x = 1; x<=NF; x++) if( NF == 1) next }
salta fuori dal loop e va direttamentesalta fuori dal loop e va direttamentead ad ENDEND oppure, in mancanza di oppure, in mancanza di
quest’ultimo, esce dai comandi di quest’ultimo, esce dai comandi di awkawk
salta fuori dal loop e va direttamentesalta fuori dal loop e va direttamentead ad ENDEND oppure, in mancanza di oppure, in mancanza di
quest’ultimo, esce dai comandi di quest’ultimo, esce dai comandi di awkawk
scartascarta il record corrente e il record corrente elegge il legge il prossimoprossimo record, record,
ricominciando il flusso di comandiricominciando il flusso di comandiDAL PRIMO comandoDAL PRIMO comando
scartascarta il record corrente e il record corrente elegge il legge il prossimoprossimo record, record,
ricominciando il flusso di comandiricominciando il flusso di comandiDAL PRIMO comandoDAL PRIMO comando
scartascarta il record corrente e il record corrente elegge il legge il prossimoprossimo record, record,ricominciando il flusso diricominciando il flusso di
comandi comandi dal puntodal puntoappena dopoappena dopo getline getline
scartascarta il record corrente e il record corrente elegge il legge il prossimoprossimo record, record,ricominciando il flusso diricominciando il flusso di
comandi comandi dal puntodal puntoappena dopoappena dopo getline getline
272*
SommarioSommarioSommarioSommario
Come esempio finale dell’uso di awk viene mostrato un awk script che controlla se uno
o piu’ files di testo hanno due parole adiacenti identiche (errore tipografico piuttostocomune) e riporta tale evenienza in output.
FILENAMEFILENAME :nome del file :nome del filecorrentemente esaminatocorrentemente esaminato
FILENAMEFILENAME :nome del file :nome del filecorrentemente esaminatocorrentemente esaminato
NFNFnumero di fieldsnumero di fields
nel recordnel recordcorrentementecorrentemente
esaminatoesaminato
NFNFnumero di fieldsnumero di fields
nel recordnel recordcorrentementecorrentemente
esaminatoesaminato
numero totalenumero totaledi linee di inputdi linee di inputesaminate finoraesaminate finora
numero totalenumero totaledi linee di inputdi linee di inputesaminate finoraesaminate finora
273*