Comandi sui File
I comandi sono di due tipi:
- comandi interni della shell
- comandi esterni, file eseguibili
I comandi interni della shell Bash sono numerosi. Per avere la loro lista completa digitare:
help
Per ottenere un (piccolo) aiuto su ciascuno di essi, digitare help comando
.
I comandi esterni devono avere il permesso di esecuzione per chi li invoca.
Possono essere:
- un eseguibile binario - viene caricato dalla libreria loader
- una procedura interpretata - viene caricato dall'interprete nel cui linguaggio è scritta
I file di procedura interpretata devono avere a prima linea il costrutto Hash Bang, cioè i caratteri #!
seguiti dal Vettore di Lancio dell'interprete per la procedura corrente (percorso completo ed eventuali opzioni).
Le procedure quindi iniziano con, p.es.:
#! /usr/bin/perl
Se lo Hash Bang non è indicato, le procedure vengono passate all'eseguibile descritto dalla variabile d'ambiente SHELL: tipicamente /bin/bash
.
Esempio
$ echo "echo Ciao" > saluto1
$ chmod +x saluto1
$ ./saluto1
Ciao
$ echo 'printf("addio\n");' > saluto2
$ chmod +x saluto2
$ ./saluto2
./saluto2: line 1: syntax error near unexpected token `"addio\n"'
./saluto2: line 1: `printf("addio\n");'
$
$ echo '#! /usr/bin/perl' > saluto2
$ echo 'printf("addio\n");' >> saluto2
$ ./saluto2
addio$
$ cat saluto1
echo Ciao
$ cat saluto2
#! /usr/bin/perl
printf("addio\n");
$ echo $SHELL
/bin/bash
$
Percorsi
Il percorso è la locazionedi un file nel FSH. Può essere:
- Percorso assoluto - inizia con / (slash) e parte dalla directory radice
es: /usr/share/man/man1/zsh.1.gz
- Percorso relativo - non inizia con / (slash) e parte dalla directory corrente
es: bin/try1.pl
Un percorso ha due componenti:
basename
: nome del file dopo ultimo /dirname
: percorso prima dell'ultimo /
Quindi il percorso intero è: pathname = [dirname/]basename
Si chiama pathname qualificato quello in cui il dirname è esplicitato. Si chiama pathname non qualificato quello in cui vi è solo la componente basename.
Esempi: sono qualificati bash
/usr/bin/passwd
./saluto1
bin/micro
Non sono qualificati:
passwd
saluto2
micro
I comandi espressi da un pathname qualificato vengono eseguiti direttamente
I comandi espressi dal solo basename vengono sempre ricercati nelle directories espresse dalle variabili d'ambiente PATH
- Solo in quelle. Non di default nella directory corrente.
Per sicurezza la directory corrente non è mai nel PATH
Esecuzione di prova, nella directory corrente
./prova
Ricerca di un eseguibile nel PATH:
which eseguibile
Il comando eseguibile è trovato ma non eseguito, e otteniamo ad output il percorso qualificato di eseguibile.
Notare che se eseguibile non c'è o non è nel PATH, which
non dà errore, semplicemente un output vuoto.
Gestione Directories
Creazione di directory:
mkdir newdir
Rimozione di directory:
rmdir dir
Deve essere vuota. Per rimuovere una directory non vuota:
rm -rf dir
Rimozione ricorsiva della directory e di tutto il suo contenuto senza warnings (ATTENZIONE!)
Cambiamento di directory:
cd dir
Casi speciali:
cd
: (senza argomento) torna alla directory di login – valore della variabile d'ambiente $HOME - anchecd ~
cd ~pluto
: alla HOME directory di plutocd -
: torna alla directory precedente l'ultimo cd
Lista contenuto di una directory:
ls dir
Molte opzioni. Per listare la directory stessa e non il suo contenuto: ls -d dir
Verifica della directory corrente:
pwd
: (print working directory) mostra il percorso completo directory corrente
E' molto importante sapere sempre in che directory ci troviamo prima di dare dei comandi. I processi hanno il concetto di Working Directory (Directory di Lavoro), che è quella in cui sono stati lanciati. I processi possono avere deggli errori se la loro directory di lavoro non ha i permessi adeguati.
Il comando di copia
Sintassi:
cp sorgente destinazione
cp sorg1 sorg2 sorg3 ... destinazione
Due tipi di copia:
- Copia singola
- sorgente deve essere un file
- destinazione può essere
- file nella stessa directory (nuovo nome)
- file in altra directory (stesso o nuovo nome)
- directory (stesso nome)
- Copia multipla
- destinazione deve essere directory (stesso nome)
Due casi per il file di destinazione:
- File destinazione esiste: è riscritto
- File destinazione non esiste: è creato
Il comando cp
è un comando lento, perchè compie le seguenti operazioni:
- generazione di una nuova directory entry
- il campo nome è kl nome del file di destinazione
- viene allocato un nuovo inode e inserito nel campo inode
- ricorsivamente:
- allocazione di un nuovo blocco dati
- puntatore dell'inode al nuovo blocco dati
- copia dei dati del blocco dati sorgente nel blocco dati di destinazione
Il comando di link
Sintassi:
ln vecchionome nuovonome
Crea un nuovo nome file per lo stesso file riferito dal nome vecchio
- Il nome vecchio deve esistere
- Il nome nuovo non deve esistere
- può essere una directory: stesso nome del vecchio
- Il nuovo nome deve essere nello stesso file system del vecchio nome
Dopo il link non si sa più qual'era il file originale (situazione simmetrica). Il listato mostra che entrambi i file hanno ora un numero di riferimenti di 2 - in realtà sono lo stesso file.
Con il comando ls -li
viene mostrato il numero di inode dei file.
Si può notare che vecchionome e nuovonome si riferiscono allo stesso inode e sono quindi due nomi diversi per lo stesso file.
Il comando ln
è un comando veloce. Compie le seguenti operazioni:
- alloca una nuova directory entry
- il campo nome è il nome del nuovo file
- il campo inode è lo stesso del vecchio file
- nell'inode viene aumentato di 1 il numero dei riferimenti
Attenzioni
Il comando ln
si chiama anche Hard Link e:
- non si può dare se la destinazione è in un file system diverso dalla sorgente
- non si può dare se la sorgente è una directory
A cosa serve
Se avessimo due file linkati staticamente, p.es. comprime
e decomprime
, l'algoritmo di compressione e decompressione sarebbe praticamente lo stesso in entrambi e si avrebbe uno spreco di spazio disco.
Si può pensare di fare un singolo file, che abbia del codice aggiuntivo all'inizio. Il codice testa con che nome è stato invocato, e ha due comportamenti a seconda del nome. Si risparmia spazio disco.
Al limite è pensabile di avere decine di comandi che in realtà sono nomi diversi per lo stesso file eseguibile sottostante.
Questa è effettivamente la situazione dell'utility busybox
, che implementa decine di comandi di base in distribuzioni di Linux mimime, quali ad esempio usate in contenitori Docker.
Il comando di rimozione
Sintassi:
rm file
Il comando rm
corrisponde internamente alla system call unlink()
ed effettivamente di suo compie le operazioni inverse di ln
:
- Rimuove la directory entry col nome che si riferisce al file
- Decrementa il numero di riferimenti di 1 nell'inode
- Se ora il numero di riferimenti è ancora maggiore di zero gli altri nomi e il file rimangono
Se il numero riferimenti nuovo è zero viene invocata una funzione di Garbage Collection del device driver del filesystem:
- I blocchi del file ritornano alla lista dei blocchi liberi
- Il contenuto dei blocchi non viene toccato per velocizzare le operazioni
- I puntatori nell'inode sono azzerati
- L'inode è riallocabile
Il comando rm
è un comando veloce se avanzano riferimenti, lento se viene cancellato l'ultimo riferimento.
In molti file system il file non più recuperabile. Non esiste un comando undelete.
Ciò non esclude sempre la possibilità di recuperare, almeno parzialmente, il file rimosso, ma con l'uso di procedimenti forensi ed utilities molto specializzate (non parte della distribuzione standard).
Se si vuole contrastare la possibilità di analisi forense dei dati cancellati, occorre recuperare e installare separatamente delle utilities che cancellino completamente i dati dai blocchi di allocazione all'atto della rimozione del file.
Il comando mv
Sposta un file dalla sua locazione in una directory entry in un'altra locazione.
Sintassi:
mv sorgente destinazione
mv sorg1 sorg2 sorg3 ... destinazione
Stessa sintassi di cp
.
Operazione combinata di ln
di un nome nuovo e rm
del nome vecchio, atomica - non si può interrompere a metà.
La destinazione può avere lo stesso nome se è in una directory differente.
Non si può avere la destinazione in un file system diverso dalla sorgente.
Ma in tal caso molte distribuzioni eseguono un cp
seguito da un rm
(non è più atomica).
Esempi:
Link simbolico
Sintassi:
ln -s vecchionome nuovonome
Stessa sintassi di ln
.
Crea un nuovo file destinazione di tipo “link”:
- i blocchi dati contengono il vecchio nome
- usare il nuovo file causa una redirezione interna al vecchio file
- si possono creare in altri file systems
Situazione di “broken link” se
- il file originale è stato rimosso
- il file system originale è irraggiungibile
E' una situazione asimmetrica.
Viene usato per tre scopi diversi:
- si intende compiere un link di una directory, per cui non è possibile uno hard link
- si intende fornire un riferimento atteso da un applicativo, ma che nel sistema corrente ha un nome diverso da quello che si aspetta l'applicativi (p.es.
vi
) - il file sorgente e destinazione sono in file system diversi
E' molto usato in Linux.