SO Tutorial Lab Unix Shell
SO Tutorial Lab Unix Shell
Sistemi Operativi
Mario Di Raimondo
A.A. 2016-2017
Cos’é l’autenticazione?
La shell
Il filesystem
Esempio di filesystem
I path (1)
Per lavorare con gli oggetti del filesystem ci serve poterli identificare in un
modo ben preciso. Vengono utilizzati due metodi principali:
Percorso assoluto
Il percorso assoluto (o “absolute path”) di un file è il percorso che va dalla
radice del filesystem allo stesso.
Il percorso parte dalla root quindi inizia con il carattere / e ogni elemento
del path è separato dal precedente da un altro carattere /.
Esempio: /home/utente/file.txt
Percorso relativo
Fissando logicamente una particolare directory (in genere quella corrente)
è possibile identificare un file attraverso il percorso relativo (o “relative
path”) che va da tale directory ad esso.
Un percorso relativo non inizia mai con il carattere /.
Esempio: utente/documenti/cv.pdf
Mario Di Raimondo (DMI) Tutorial sulla Shell Linux A.A. 2016-2017 6 / 73
Introduzione Concetti fondamentali
I path (2)
I path (3)
Osservazione
In effetti il percorso assoluto di un file è il suo percorso relativo rispetto
alla root.
Nella costruzione dei percorsi possiamo utilizzare due “cartelle virtuali”
che esistono in ogni directory:
la cartella .: indica la cartella stessa (“auto-referenziamento”);
la cartella ..: indica la cartella genitore.
La cartella speciale .. risulterà molto utile per navigare all’interno del
nostro filesystem.
I path (4)
File speciali
Più di un filesystem
Esempio di mount
I comandi
I parametri
ls
Sintassi (semplificata): ls [-l] [-a] [-R] [pathname...]
-l: visualizza informazioni dettagliate
-a: visualizza anche i file nascosti
-R: visualizza anche il contenuto delle cartelle ricorsivamente
pathname: oggetto del filesystem sul quale visualizzare le informazioni
Il comando ls consente di visualizzare informazioni sugli oggetti presenti
nel filesystem. Mediante il parametro pathname è possibile identificare
l’oggetto sul quale reperire le informazioni. Se pathname è una directory
allora viene visualizzato tutto il contenuto di quest’ultima. ls lanciato
senza parametri assume come pathname la directory corrente. E’ possibile
specificare più pathname sulla stessa linea di comando, il comando
visualizzerà informazioni per ciascuno di essi.
Quando viene utilizzata l’opzione -l con ls, questo riporta una lista in cui
per ogni riga ci sono i dettagli su un file o directory.
La tipica riga potrebbe essere la seguente:
-rwxr-xr-x 1 utente gruppo 5642 2005-09-20 10:12 script.sh
i permessi di accesso dell’utente, gruppo e degli altri;
il numero di hard link (lo vedremo dopo);
il proprietario ed il gruppo;
le dimensioni del file;
la data e l’ora di creazione del file;
il nome del file.
I permessi di accesso
Esempio di uso di ls
$ ls
cartella esempio2 . txt esempio . txt script . sh
$ ls - la
drwxr - xr - x 3 mario mario 4096 2005 -09 -20 12:30 .
drwxr - xr - x 3 mario mario 4096 2005 -09 -20 12:28 ..
drwxr - xr - x 2 mario mario 4096 2005 -09 -20 12:30 cartella
-rw -r - -r - - 1 mario mario 27 2005 -09 -20 12:30 esempio2 . txt
-rw -r - -r - - 1 mario mario 21 2005 -09 -20 12:29 esempio . txt
- rwxr - xr - x 1 mario mario 10 2005 -09 -20 12:30 script . sh
$ ls -R
.:
cartella esempio2 . txt esempio . txt script . sh
./ cartella :
agenda . txt eseguimi . sh
$ ls -l cartella /
-rw -r - -r - - 1 mario mario 21 2005 -09 -20 12:33 agenda . txt
- rwxr - xr - x 1 mario mario 10 2005 -09 -20 12:33 eseguimi . sh
I metacaratteri
$ ls
esempio2 . txt esempio3 . txt esempio . txt script . sh scheda . pdf documento . pdf prova . sh
$ ls esempio *. txt
esempio2 . txt esempio3 . txt esempio . txt
$ ls esempio ?. txt
esempio2 . txt esempio3 . txt
Cambiamo directory
cd
Sintassi : cd [pathname]
pathname: nuova directory corrente
Il comando cd consente di navigare all’interno del filesystem cambiando di
volta in volta la directory corrente. Se si omette il parametro pathname la
directory corrente viene impostata alla home directory per l’utente attuale
(in genere /home/nomeutente).
Si possono usare sia i pathname assoluti che relativi, compresa l’utilissima
directory virtuale ...
pwd
Sintassi : pwd
Il comando pwd (present working directory) permette di conoscere il
pathname assoluto della directory corrente.
mkdir
Sintassi : mkdir [-p] pathname...
-p: non genera errori se il pathname esiste già ed inoltre crea tutte le
directory necessarie per creare il pathname passato
pathname: pathname da creare
Il comando mkdir modifica la struttura del filesystem creando le directory
specificate mediante i parametri. E’ possibile specificare più pathname
sulla stessa linea di comando, il comando verrà eseguito per ciascuno di
essi.
rmdir
Sintassi : rmdir [-p] pathname...
-p: tenta di rimuovere tutte le directory che compongono il
pathname; un comando rmdir -p /a/b/c/ è equivalente a rmdir
/a/b/c /a/b/ /a/
pathname: directory da eliminare
Il comando rmdir modifica la struttura del filesystem cancellando le
directory specificate mediante i parametri. E’ possibile specificare più
pathname sulla stessa linea di comando, il comando verrà eseguito per
ciascuno di essi.
Le directory devono essere vuote altrimenti non vengono cancellate.
cp
Sintassi (semplificata): cp [-R] [-i] source... dest
-R: copia tutto il contenuto di source se è una directory
-i: chiede conferma prima di sovrascrivere i file
source: oggetti da copiare in dest; si possono specificare più
sorgenti nella stessa riga di comando
dest: destinazione in cui copiare i file specificati
Il comando cp copia i file specificati con source... in dest. Se si
specifica una sola sorgente (ad esempio un file) allora specificando il
pathname completo di un file come destinazione, questo viene copiato e
rinominato. Se si specifica una cartella esistente come destinazione, i file
vengono copiati al suo interno. Se si specificano più sorgenti, allora la
destinazione deve essere necessariamente una cartella (esistente).
rm
Sintassi: rm [-r] [-i] [-f] pathname...
-r: se pathname è una directory, elimina ricorsivamente tutti i file o
cartelle contenuti al suo interno
-i: chiede conferma prima di cancellare ogni file
-f: cancella gli oggetti senza chiedere conferma
pathname: oggetti da eliminare
Il comando rm elimina tutti i file specificati con i parametri pathname....
Se viene specificato il parametro -r vengono eliminate ricorsivamente
tutte le directory presenti nel sottoalbero della directory specificata con
pathname.
mv
Sintassi: mv source... dest
source: file o directory da spostare
dest: file o directory di destinazione
Il comando mv sposta il file o directory sorgente nella destinazione
specificata. Se si specifica solo una sorgente (un file o una directory) e la
destinazione non esiste, allora la sorgente viene rinominata oltre che
spostata. Se si specificano più parametri source, dest deve essere una
directory.
Nota: spostare una directory in un’altra implica lo spostamento di tutto il
sottoalbero della directory sorgente.
Redirezione dell’I/O
cat
Sintassi: cat [pathname...]
pathname: file da visualizzare
Il comando cat permette di visualizzare (nel senso di mandare allo
standard output) il contenuto di uno o più file.
Volendo si può invocare senza alcun parametro ed in questo caso cat
prenderà il suo standard input come input (come la maggior parte dei
comandi UNIX).
Dica “trentatre”
echo
Sintassi: echo [-n] [-e] [stringa...]
-n: non manda a capo il carrello quando ha finito
-e: permette l’uso di alcuni caratteri speciali
stringa: stringa da visualizzare
Il comando echo da in output una stringa passata come parametro.
Esempi di caratteri speciali che è possibile utilizzare utilizzando l’opzione
-e sono: \a bell (campanello), \n new line, \t tabulazione, \\ backslash,
\nnn il carattere il cui codice ASCII (in ottale) è nnn.
$ man c o m a n d o c h e n on e s i s t e
Non cè’ il manuale per c o m a n do c h e n o n e s is t e
more
Sintassi: more [pathname...]
pathname: file da visualizzare
Il comando more si comporta come cat (inviando il suo standard input o il
file specificato al suo output) con l’eccezione che se l’output è più lungo di
una videata di schermo, ad ogni pagina viene fatta una pausa.
less
Sintassi: less [pathname...]
pathname: file da visualizzare
Il comando less è una versione più evoluta di more: non solo permette di
fare pause ad ogni pagina, ma permette anche di andare su e giù
nell’output. Inoltre è possibile effettuare semplici ricerche interattive
all’interno dell’input.
Le pipeline
$ ls | lpr
Impariamo a contare
wc
Sintassi: wc [-c] [-w] [-l][pathname...]
-c, -w, -l: conteggia, rispettivamente, i caratteri/le parole (separate
da spazi)/le righe
pathname: file da analizzare
Il comando wc effettua l’analisi del suo standard input (se non vengono
passati parametri) o dei file passati conteggiando il numero di byte, parole
e/o righe. Se non si specifica una opzione particolare vengono riportati
tutti e tre i conteggi. Si possono passare più file.
sort
Sintassi (semplificata): sort [-n] [-r] [-o file] [-t s]
[-k s1[,s2]] [pathname]
-n: considera numerica (invece che testuale) la chiave di ordinamento
-r: ordina in modo decrescente
-o file: invia l’output su file anziché sullo standard output
-t s: usa s come separatore di campo
-k s1,s2: usa i campi da posizione s1 a s2 per l’ordinamento
pathname: file da ordinare
Il comando sort ordina trattando ogni linea del suo input come una
collezione di campi separati da delimitatori (default: spazi, tab, ecc.).
L’ordinamento di default avviene in base al primo campo ed è alfabetico.
$ ls -1 | sort -r
script . sh
scheda . pdf
prova . sh
esempio3 . txt
esempio2 . txt
documento . pdf
conta . sh
Testa e coda
head
Sintassi (semplificata): head [-c q] [-n q] [pathname...]
-c q: mostra solo i primi q byte dell’input
-n q: mostra solo le prime q righe dell’input
pathname: file da analizzare
Il comando head mostra di default le 10 righe del suo input. Può accettare
anche più file.
tail
Sintassi (semplificata): tail [-c q] [-n q] [pathname...] Il
comando tail si comporta come head ma a partire dalla fine dell’input.
chmod
Sintassi: chmod [-R] mode [pathname...]
-R: applica i permessi in modo ricorsivo alle sotto-cartelle
mode: nuova maschera dei permessi
pathname: oggetti a cui applicare la nuova maschera dei permessi
Il comando chmod permette di cambiare i permessi a file o cartelle.
rw-r----- ←→ u=rw,g=r,o-rwx
rw-rw-rw- + u+x,o-rw −→ rwxrw----
rw-r--r-- + a-r,u+r −→ rw-------
rw-r--r-- + +x −→ rwxr-xr-x
Mario Di Raimondo (DMI) Tutorial sulla Shell Linux A.A. 2016-2017 39 / 73
La shell ed i suoi comandi Altri comandi
chown
Sintassi: chown [-R] owner[:group] [pathname...]
-R: esegue ricorsivamente le modifiche di proprietà
owner: il nuovo proprietario
group: il nuovo gruppo proprietario
pathname: oggetti a cui cambiare la proprietà
Il comando chown permette di cambiare i proprietari associati ad uno o più
file.
chgrp
Sintassi: chgrp [-R] group [pathname...]
-R: esegue ricorsivamente le modifiche di proprietà
group: il nuovo gruppo proprietario
pathname: oggetti a cui cambiare la proprietà
gzip
Sintassi (semplificata): gzip [-d] [-c] [pathname...]
-d: decomprime invece che comprimere
-c: il file compresso viene mandato allo standard output
pathname: file da comprimere
Il comando gzip comprime, con appositi algoritmi, il contenuto dei file
specificati o del suo standard input per occupare meno spazio. Se vengono
specificati sulla riga di comando, i file vengono sostituiti da una versione
compressa con estensione .gz. Se non viene passato nulla, lo standard
input viene compresso e passato allo standard output (funziona da filtro).
$ ls -l config .*
-rw -r - -r - - 1 mario mario 2389 2005 -09 -23 12:41 config . txt
$ gzip config . txt
$ ls -l config .*
-rw -r - -r - - 1 mario mario 813 2005 -09 -23 12:41 config . txt . gz
$ gunzip config . txt . gz
$ ls -l config .*
-rw -r - -r - - 1 mario mario 2389 2005 -09 -23 12:41 config . txt
I comandi UNIX tipo gzip hanno scopi ben diversi dai più noti programmi
di compressione ZIP e RAR. Quest’ultimi hanno lo scopo di mettere in un
archivio compresso più file se non interi alberi del filesystem.
I comandi tipo gzip sono comandi di flusso che invece hanno lo scopo di
comprimere un flusso di dati che nel caso base può essere semplicemente
un file.
Nota
Nel mondo UNIX esistono comandi che permettono di gestire i formati
ZIP e RAR. Quest’ultimi però vanno considerati solo standard di fatto
essendo formati proprietari (anche se aperti) creati da aziende.
Lo standard di compressione nei sistemi UNIX fanno riferimento a gzip,
bzip2 e, recentemente, xz.
Se vogliamo archiviare più file o un intero ramo del filesystem sotto UNIX
si usa un comando secondario: tar
Il comando tar accetta anche una sintassi più stringata per le opzioni: si
possono omettere i trattini davanti alle opzioni e si possono, ovviamente,
raggruppare.
La compressione degli archivi si ottiene facendo “passare” gli archivi .tar
attraverso un filtro di compressione (gzip, bzip2, o xz) in modo esplicito
(usando una pipe) oppure in modo implicito (utilizzando le opzioni -z,-j
o -J).
Le estensioni per gli archivi compressi diventano: .tar.gz, .tar.bz2 e
.tar.xz.
I file vengono inseriti nell’archivio con il path relativo alla directory
corrente.
Se non viene specificato il nome dell’archivio si lavora con lo standard
input e lo standard output
Sono disponibili tante altre opzioni che permettono anche la modifica e
l’aggiornamento degli archivi.
Mario Di Raimondo (DMI) Tutorial sulla Shell Linux A.A. 2016-2017 48 / 73
La shell ed i suoi comandi Altri comandi
Gli alias
La bash da la possibilità di definire dei nomi propri in modo tale che
corrispondano a sequenze arbitrarie di comandi e opzioni.
alias
Sintassi: alias [name[=value]]
Invocare alias senza parametri visualizza la lista degli alias correntemente attivi.
Una invocazione del tipo alias name visualizza l’associazione attuale (se ne
esiste già una). Per rimuovere un alias si utilizza il comando unalias name.
$ alias ll = ’ ls -l ’
$ ll /
drwxr - xr - x 2 root root 4096 2005 -09 -23 08:27 bin
drwxr - xr - x 3 root root 4096 2005 -09 -23 09:26 boot
drwxr - xr - x 11 root root 13520 2005 -09 -23 12:30 dev
.... ........ ..
$ alias ls = ’ ls -- color ’
$ alias rm = ’ rm -i ’
$ unalias rm ls
I link simbolici (detti anche soft link) sono dei file speciali che contengono
al loro interno il riferimento al file a cui puntano.
In effetti sono dei piccoli file di testo contenente il path assoluto o relativo
(alla directory in cui si trova il link simbolico) per raggiungere il file a cui
si riferiscono (il file target).
$ ls -l file_ ?
-rw -r - -r - - 1 mario mario 2389 2005 -09 -23 18:50 file_A
lrwxrwxrwx 1 mario mario 6 2005 -09 -23 18:48 file_B -> file_A
Una invocazione del comando ls -l con tutti i dettagli sui file rivela la
natura del link simbolico: un flag l vicino ai diritti indica che si tratta di
un link simbolico; vicino al nome del link simbolico viene indicato il nome
del file target.
Se viene rimosso il soft link, il file target rimane inalterato. Se si cancella il
file target, il soft link diventa inconsistente.
Mario Di Raimondo (DMI) Tutorial sulla Shell Linux A.A. 2016-2017 52 / 73
La shell ed i suoi comandi Altri comandi
I link fisici (detti anche hard link) hanno una natura diversa ed agiscono ad
un livello del filesystem più basso.
Senza scendere nei dettagli (lo vedremo meglio più avanti nel corso), i
filesystem UNIX rappresentano ogni oggetto (file o cartella) con un inode
memorizzato in una parte del disco. Se una cartella contiene quel file, avrà
un riferimento all’indirizzo dell’inode che memorizza il file (come se fosse
un puntatore ad un oggetto).
Un hard link agisce creando, nella cartella che lo contiene, un secondo
puntatore al medesimo inode. Ci saranno due puntatori allo stesso inode.
Dato un file e creato un hard link ad esso, a posteriori è impossibile
distinguere qual’era il nome originale e quale il link quindi si ha una
trasparenza totale a livello di applicazione.
Per gestire gli hard link, il filesystem UNIX mantiene per ogni inode un
contatore del numero di link fisici che puntano ad esso.
Per sapere quanti hard link puntano allo stesso file si può usare il comando
ls:
$ ls -l file_ ?
-rw -r - -r - - 2 mario mario 2389 2005 -09 -23 18:50 file_A
-rw -r - -r - - 2 mario mario 2389 2005 -09 -23 18:50 file_B
ln
Sintassi: ln [-s] target... [linkpathname]
-s: crea un link simbolico invece che uno fisico
target: file o directory a cui il link farà riferimento
linkpathname: pathname del link
Il comando ln consente di creare link tra i file e le directory presenti nel
filesystem. I link vengono creati utilizzando il parametro linkpathname e
fanno riferimento al target specificato. Se si specificano più target,
linkpathname deve essere una directory: verranno creati tutti link con gli
stessi nomi dei target.
Se si omette il parametro linkpathname il link viene creato nella directory
corrente usando lo stesso nome del target.
Esistono varie modalità di esecuzione dei comandi sotto una shell. La più
semplice consiste nell’invocazione di un singolo comando (con relativi
parametri).
Ogni comando restituisce un exit status che rappresenta l’esito della
computazione del comando stesso. Mediante l’exit status è possibile
controllare la buona riuscita di un comando.
L’exit status è un intero:
0: esecuzione riuscita con successo;
n > 0: esecuzione fallita;
L’esecuzione di un comando da shell, la sospende temporaneamente fino
alla terminazione del comando stesso.
L’abbiamo già spiegata prima: una cascata di processi in cui ognuno riceve
l’output del precedente come input. L’output della pipeline corrisponde
all’output dell’ultimo processo.
fork
cmd1
wait
fork
cmd2
wait
fork
cmd3
wait
$ false && c o m a n d o _ i n e s i s t e n t e _ c h e _ n o n _ v e r r a _ m a i _ e s e g u i t o
La shell associa ad ogni comando semplice (o pipeline) uno job. Ogni job
ha un numero che lo identifica univocamente in un dato istante.
Quando un comando viene eseguito in modo asincrono, la shell da un
output del tipo:
[jobnumber] PID
dove jobnumber è il numero dello job eseguito in background e PID è
l’identificativo di processo che porta effettivamente avanti il job.
Comandi disponibili:
jobs: visualizza i jobs correntemente attivi ed il loro stato;
bg: manda in background l’esecuzione di uno job;
fg: porta in foreground l’esecuzione di uno job;
kill: invia un segnale ad uno job.
A proposito di kill: con kill -# PID si invia il segnale numero # al
processo con con identificativo PID.
Tra quelli standard: 3 QUIT e 9 KILL.
Mario Di Raimondo (DMI) Tutorial sulla Shell Linux A.A. 2016-2017 63 / 73
La shell ed i suoi comandi Altri comandi
Le variabili
Command substitution
$ ls | wc -w
15
$ PAROLE = ‘ ls | wc -w ‘
Quoting
$ echo $PATH
/ home / mario / bin :/ usr / local / bin :/ usr / bin :/ bin :/ usr / bin / X11 :/ usr / games
$ echo \ $PATH
$PATH
find
Sintassi: find [pathname...] [expression]
pathname: percorso in cui cercare (ricorsivamente) i file da esaminare
expression: specifica le regole con cui selezionare i file; può essere una fra
le seguenti:
opzione: modifica il comportamento della ricerca; per esempio -mount;
condizione: condizioni da verificare; ad esempio -name modello,
-user utente, -group gruppo, -type c, ...
E’ possibile usare anche operatori logici tipo: -not expr, expr1 -or
expr2, ...
azione: specifica cosa fare quando trova un file; ad esempio -exec
comando {} , -print, ...
Ricerca ricorsivamente all’interno dei pathname specificati dei file che
soddisfino le espressioni expression date. Man mano che i file vengono
trovati i nomi vengono stampati a video o altro se specificato.
Le Mario
opzioni sono tante, per ulteriori
Di Raimondo (DMI)
dettagli consultare man A.A.
Tutorial sulla Shell Linux
find.2016-2017 69 / 73
La shell ed i suoi comandi Altri comandi
-w: vengono restituite solo le linee che contengono il pattern/stringa come parola completa
Cerca all’interno delle righe dei file specificati con filename le righe che
contengono (o meno, a secondo delle opzioni) il pattern specificato. Il pattern
può essere una semplice stringa o una regular expression.
Esistono due varianti di grep: fgrep (Fixed General Regular Expression Parser) e
egrep (Extended General Regular Expression Parser).
Volendo si possono ottenere i medesimi risultati con le opzioni -F e -G di grep.
Mario Di Raimondo (DMI) Tutorial sulla Shell Linux A.A. 2016-2017 71 / 73
La shell ed i suoi comandi Altri comandi
Espressioni Regolari
Attraverso le espressioni regolari è possibile specificare dei pattern più complessi
della semplice stringa contenuta.
metacarattere tipo significato
b basic inizio della linea
$ basic fine della linea
. basic un singolo carattere (qualsiasi)
[str] basic un qualunque carattere in str
[bstr] basic un qualunque carattere non in str
[a-z] basic un qualunque carattere tra a e z
\ basic inibisce l’interpretazione del carattere successivo
* basic zero o più ripetizioni dell’elemento precedente
+ ext una o più ripetizioni dell’elemento precedente
? ext zero o una ripetizione dell’elemento precedente