Next: La struttura generale dei comandi unix, Previous: La shell, Up: Nozioni elementari sul sistema operativo unix
Siccome moltissimi dei comandi essenziali che userete riguardano i
files e le directories, e' importante sapere, anche solo in modo
estremamente semplificato, come sono organizzati i files in ambiente
unix. L'organizzazione dei files viene detta file system
.
Il file system di unix e' un sistema ad albero organizzato in
cosiddette directories (le "cartelle" di windows). Il file system
parte da una cosiddetta root directory
e si ramifica in altre
(sub)directories, ciascuna a sua volta ramificata, e cosi' via. Ogni
directory ha un nome, che puo' essere qualunque. La root directory
(che e' la "madre" di tutte le directories di un file system) ha un
nome particolare: /
(slash).
A parte il fatto di cominciare sempre con la root directory chiamata
/
, un file system puo' contenere un numero qualsiasi di
directories chiamate con nomi qualsiasi e organizzate in modo
qualsiasi; in pratica, pero', la posizione nella struttura ad albero e
il nome di molte directories di un sistema unix sono ormai consacrati
dalla tradizione.
Ecco come si presentano i primi rami di un tipico file system unix:
/ <=========== questa e' la root directory |-- bin |-- boot |-- dev | |-- pts | `-- .... |-- etc | |-- X11 | |-- profile.d | `-- .... |-- home | |-- balducci | |-- ditommas | |-- vicario | `-- .... |-- lib | |-- modules | `-- .... |-- lost+found |-- misc |-- mnt | |-- cdrom | `-- .... |-- opt | |-- intel | `-- .... |-- sbin |-- sys | |-- block | `-- .... |-- tmp | |-- gsrvdir0 | `-- .... |-- usr | |-- X11 | |-- bin | |-- dict | |-- etc | |-- games | |-- html | |-- include | |-- lib | |-- libexec | |-- local | |-- man | |-- sbin | |-- share | |-- src | `-- var `-- var |-- cache `-- ....
Le immediate subdirectories della root directory si chiamano
bin
, boot
, dev
, etc
e cosi' via. Queste, a
loro volta, sono ulteriormente ramificate: ad esempio, la directory
home
possiede delle subdirectories chiamate balducci
,
ditommas
, vicario
etc.
Ad ogni directory del file system e' associato un certo numero di files (un file e' un contenitore di informazioni: ad esempio, se scrivete una relazione di laboratorio con un word processor, questa verra' "salvata" in un file; oppure potete salvare in un file dei dati relativi a misure che avete fatto in laboratorio, e cosi via). Il nome con cui vengono chiamate le directories in ambiente windows e' abbastanza indovinato: potete immaginare una directory come una cartella: ciascun foglio (o gruppo di fogli pinzati assieme) che la cartella contiene e' un file.
Quindi diciamo che un certo file "si trova" in una certa directory.
Ogni directory o file presente in un file system puo' essere
individuato in modo univoco specificando la lista ordinata
dei nomi di tutte le directories che si incontrano per arrivare ad
esso partendo dalla root directory: tale lista viene detta path
(sentiero, percorso). I nomi delle directories che costituiscono un
dato path vengono separati dal carattere slash (/
).
Ad esempio, se guardate la porzione di file system mostrata piu'
sopra, vedrete che ci sono due directories con lo stesso nome
(X11
): una e' figlia di etc
e una e' figlia di
usr
. Le due directories sono pero' distinte senza ambiguita' se
le indichiamo con il loro path completo:
/etc/X11 /usr/X11
Lo stesso discorso vale per i files contenuti nelle directories: ogni
file puo' essere individuato senza ambiguita' dal suo path
completo. Ad esempio, il path completo del file chiamato foo
contenuto nella directory chiamata bar
, figlia della directory
chiamata jane
, a sua volta figlia della directory chiamata
tarzan
, che e' figlia della root directory sara':
/tarzan/jane/bar/foo
Se nella directory bar
ci sono anche altri due files chiamati
mikeze
e jakeze
, i loro path completi saranno:
/tarzan/jane/bar/mikeze /tarzan/jane/bar/jakeze
Da quanto detto dovrebbe essere chiaro che una stessa directory non puo' contenere due files con lo stesso nome, mentre e' perfettamente legale che ci siano due files con lo stesso nome in due directories diverse (essi avranno path completi diversi).
Come vedremo, ci sono dei comandi unix che servono per "spostarsi" nel file system, cioe' passare da una directory ad un'altra (ad esempio per editare dei files contenuti in directories diverse).
Quando fate un login su un sistema unix, esso vi "colloca" sempre
nella stessa directory di partenza. Tale directory e' la cosiddetta
vostra home directory
. La home directory e' specifica di
ciascun utente e il suo nome generalmente coincide con quello
dell'utente. Tutte le home directories degli utenti di un dato sistema
sono generalmente create come subdirectories di una stessa directory
chiamata home
(o people
) e figlia della root directory
(ma non c'e' nessun obbligo di fare cosi': e' solo una tradizione).
Ad esempio, se riguardate la struttura riportata piu' sopra, potete individuare la seguente porzione di albero:
/ . . . |-- home | |-- balducci | |-- ditommas | |-- vicario | `-- .... . . .
Le directories /home/balducci
, /home/ditommas
e
/home/vicario
sono le home directories di altrettanti utenti
del sistema.
Cioe' quando l'utente balducci
"entra" nel sistema, il sistema
lo "mette" nella directory /home/balducci
.
Molte shells (tra cui anche la bash, che e' la shell in uso sui PC
dell'aula computer) consentono una notazione di comodo per indicare la
home directory: invece di scrivere il suo path completo, e'
sufficiente indicarla col carattere ~
(il nome di questo
carattere e' tilde
). Vi renderete conto di come l'uso di questa
abbreviazione del nome della home directory risulti molto comodo.
Oltre all'uso del carattere tilde per indicare la home directory, ci sono altre due notazioni molto comode.
La directory in cui "ci si trova" viene detta current directory
(directory corrente) o working directory
(directory di lavoro):
si puo' fare riferimento ad essa (oltre che con il suo path completo)
anche con il carattere .
(punto). Quindi, quando in un comando
relativo al file system si usa il punto, cio' sta ad indicare la
current directory. Un comando unix che si usa spessissimo e'
pwd
, che sta per Print Working Directory: la sua funzione e'
quella di mostrare la current directory, cioe' dove ci si trova nel
file system. Ad esempio, se vogliamo sapere in che directory siamo:
dschgrazlin2:71> pwd /home/balducci/latex/lca1/web
Un'altra directory che si usa spesso nei comandi e' la directory che
sta "sopra" a quella in cui ci si trova. Tale directory viene detta
parent directory
(directory genitrice, o madre, della directory
data) e anche per essa esiste una notazione di comodo data da due
punti: ..
.
Riassumendo, ci sono tre notazioni di comodo per indicare particolari directories:
Tanto per fare un esempio, se l'utente doodle
vuole fare
riferimento al file my_stuff
di sua proprieta' che si trova nella
subdirectory stuff
, figlia della subdirectory cool
, a sua
volta figlia della sua home directory, invece di scrivere il suo path
completo:
/home/doodle/cool/stuff/my_stuff
puo' risparmiare battitura digitando:
~/cool/stuff/my_stuff
Piu' sopra abbiamo definito il path come la stringa ottenuta concatenando i nomi (separati da slashes) di tutte le directories che si incontrano per arrivare ad una certa directory o file partendo dalla root directory.
Questo e' quello che viene chiamato path assoluto o completo (absolute path). Infatti un path puo' essere specificato anche in modo relativo rispetto alla current directory. Il path viene interpretato come relativo quando non comincia con uno slash.
Ad esempio: supponiamo di trovarci nella directory
/home/balducci/tmp
e di voler fare riferimento al file il cui
path assoluto e'
/home/balducci/tmp/install-us-d/kernel.d/config.OLD
. Allora, il
path del file in questione relativo alla directory in cui ci troviamo
(cioe' la current directory) sara':
install-us-d/kernel.d/config.OLD
(notate che manca uno slash
all'inizio).
Un altro esempio che mette in evidenza l'uso della notazione ..
per indicare la parent directory. Supponiamo di trovarci nella
directory /home/balducci/tmp/articles
e di voler fare
riferimento allo stesso file dell'esempio precedente. In questo caso,
il path relativo sara':
../install-us-d/kernel.d/config.OLD
. Cioe': salgo di un livello
(il ..
iniziale) e poi raggiungo il file come prima.
Per salire di piu' livelli basta specificare piu' volte la notazione
..
. Se ci fossimo trovati nella directory
/home/balducci/tmp/articles/titania
e avessimo voluto fare
riferimento sempre allo stesso file visto prima con il suo path
relativo, avremmo dovuto usare questo:
../../install-us-d/kernel.d/config.OLD
. Il primo ..
mi
fa risalire in /home/balducci/tmp/articles
, il secondo
..
mi fa risalire in /home/balducci/tmp
e la porzione
install-us-d/kernel.d/config.OLD
mi fa raggiungere il file
desiderato.
Riassumendo: un path puo' essere: