I file sono un altro campo in cui GNU/Linux è sensibilmente diverso rispetto a Windows e a molti altri sistemi operativi. Qui vedremo le differenze più evidenti, per informazioni più approfondite consultate il capitolo Il filesystem di Linux nel Manuale di riferimento, che descrive questo argomento più in dettaglio.
La differenza principale è una diretta conseguenza del fatto che GNU/Linux è un sistema multiutente: ogni file è proprietà esclusiva di un utente e di un gruppo. Quando abbiamo accennato agli utenti, poco fa, non abbiamo citato un fatto importante: ogni utente ha una sua cartella (nota come la sua directory home), ed è il proprietario di questa directory e di tutti i file che lui stesso creerà in futuro. Solo lui, nessun altro.
Tutto questo non avrebbe grande utilità, tuttavia, se si limitasse al solo concetto di proprietà dei file. Infatti c'è dell'altro: in quanto proprietario di un file, l'utente può impostare dei permessi che riguardano il file stesso. Questi permessi sono distinti in tre diverse categorie: permessi del proprietario del file, di qualsiasi utente membro del gruppo associato al file (il cosiddetto owner group) escluso l'utente che ne è il proprietario, e gli altri, ovvero qualsiasi utente che non rientri nei primi due casi.
Ci sono tre diversi permessi:
Permesso di lettura Read (r): per un file, questo permesso consente di leggerne il contenuto; per una directory, di elencarne il contenuto (cioè i file che essa contiene).
Permesso di scrittura Write (w): per un file, questo permesso consente di modificarne il contenuto. Per una directory, permette a un utente di modificare e cancellare i file che essa contiene, anche se non è il proprietario di quei file.
Permesso di esecuzione eXecute (x): per un file, questo permesso consente di lanciarlo in esecuzione; di conseguenza, normalmente solo i file eseguibili dovrebbero avere questo permesso. Per una directory, questo permesso consente di attraversarla, cioè di spostarsi dentro o attraverso di essa. Notate che questa caratteristica è indipendente dal permesso di lettura: potrebbe capitare che abbiate il permesso per attraversare una directory, ma che non possiate leggerne il contenuto!
È possibile combinare a volontà questi permessi: come proprietari di un file, ad esempio, potete consentire solo a voi stessi di leggerlo e proibirlo a tutti gli altri utenti. Potete anche fare l'opposto, anche se a prima vista non è molto logico... Se siete proprietari del file, potete anche cambiarne il gruppo di appartenenza, purché siate membri del nuovo gruppo, e addirittura privarvi della proprietà del file (ovvero indicare un nuovo proprietario). Naturalmente, se lo fate vi priverete anche di ogni diritto sul file...
Facciamo un esempio pratico con un file e una directory. La schermata qui sotto mostra i risultati del comando ls -l impartito da una linea di comando:
$ ls -l total 1 -rw-r----- 1 maria users 0 Jul 8 14:11 un_file drwxr-xr-- 2 pietro users 1024 Jul 8 14:11 una_directory/ $ |
Da sinistra a destra, il significato delle informazioni ottenute digitando ls -l è il seguente:
i primi dieci caratteri rappresentano il tipo di file e i permessi associati. Il primo carattere indica il tipo di file: è un trattino (-) se si tratta di un file normale, o una d se è una directory. Ci sono anche altri tipi di file, che tratteremo nel Manuale di riferimento. I nove caratteri successivi rappresentano i permessi associati a quel file. Qui si notano le differenze relative alle diverse categorie di utenti per quanto riguarda lo stesso file: i primi tre caratteri rappresentano i diritti associati al proprietario del file, i tre caratteri successivi riguardano tutti i membri del gruppo (ma non l'utente proprietario del file), e gli ultimi tre valgono per tutti gli altri. Un trattino (-) indica che il permesso corrispondente non è assegnato;
quindi viene il numero di link per il file. Nel Manuale di riferimento vedremo che ciò che identifica un file non è il suo nome, bensì un numero (il numero di inode), e che è possibile che uno stesso file sul disco abbia più di un nome. Per una directory, il numero di link ha un significato particolare: di nuovo, torneremo su questo argomento nel Manuale di riferimento;
di seguito sono indicati il nome del proprietario e il nome del gruppo di appartenenza;
infine, la dimensione del file (in byte) e la data e ora della sua ultima modifica, seguite da una ripetizione del nome del file o della directory.
Diamo un'occhiata più da vicino ai permessi associati a ciascuno di questi file: prima di tutto, saltiamo il primo carattere relativo al tipo di file; per il file un_file abbiamo i seguenti diritti: rw-r------. Questi caratteri vanno interpretati come segue:
i primi tre (rw-) sono i diritti del proprietario del file, che in questo caso è maria. L'utente maria, quindi, ha il diritto di leggere il file (r) e modificarne il contenuto (w), ma non di lanciarlo in esecuzione (-);
i tre caratteri successivi (r--) riguardano tutti gli utenti che non sono maria, ma sono membri del gruppo users: questi utenti sono in grado di leggere il file (r), ma non potranno né modificarlo, né lanciarlo in esecuzione (--);
gli ultimi tre caratteri (---) riguardano qualsiasi utente che non è maria e non è membro del gruppo users: tutti questi utenti non hanno alcun diritto sul file.
Per la directory una_directory, i diritti sono rwxr-xr--, e pertanto:
pietro, come proprietario della directory, può elencare i file contenuti in essa (r), può aggiungere o rimuovere file al suo interno (w), e può attraversarla (x);
tutti gli utenti che non sono pietro, ma sono membri del gruppo users, potranno elencare i file in questa directory (r), ma non potranno rimuovere né aggiungere file al suo interno (-), e potranno attraversarla (x);
tutti gli altri utenti non avranno diritti su questa directory. Come già sapete, il solo permesso di lettura su una directory non basta per consentire a un utente di elencarne il contenuto, poiché, anche se questo permesso è presente, in questo caso il permesso di esecuzione (r--) non lo è.
Ricordate, c'è un'eccezione a questa regola: l'account root può modificare gli attributi (permessi, proprietario e gruppo di appartenenza) di tutti i file, anche se non ne è il proprietario. Questo significa che può anche diventarne proprietario. root può leggere i file per cui non ha il permesso di lettura, attraversare le directory che normalmente non potrebbe attraversare, e così via. E se gli manca un permesso, non deve far altro che assegnarselo...
Infine, vale la pena di notare le differenze relative ai nomi dei file nel mondo UNIX rispetto a Windows; sotto UNIX, infatti, questi sono molto meno limitati e molto più flessibili rispetto a quanto avviene sotto Windows:
il nome di un file può contenere qualsiasi carattere (ad eccezione del carattere corrispondente al codice ASCII 0, che indica la fine di una stringa di testo, e del carattere /, che costituisce il separatore di directory), anche quelli non stampabili. Ma soprattutto, UNIX distingue tra maiuscole e minuscole: i file readme e Readme sono diversi, perché r e R sono due caratteri del tutto diversi;
Come forse avrete notato, un nome di file non deve necessariamente avere un'estensione, a meno che voi non preferiate così. Su GNU/Linux, come pure su ogni altro sistema operativo, le estensioni non identificano realmente il contenuto di un file. Tali "estensioni", tuttavia, sono molto utili. Il carattere "punto" (.) in UNIX non è che un carattere come tutti gli altri; è importante sapere, comunque, che in UNIX i nomi di file che cominciano con un punto sono "file nascosti".