viDurante questo corso utilizzeremo una macchina virtuale con distribuzione Ubuntu 24.04.
Il sistema operativo si basa su una serie di file montati tramite un unico filesystem virtuale.
La directory principale è / e da lì:
home/ contiene le home directory degli utentidev/ device attaccati al sistemalib/ librerie utilizzate dal sistemabin/ cartella con i birnari delle applicazioni scaricate.
Per descrivere un path si possono utilizzare:/home/utente/Documents/todolists/groceries.txt./Documents/todolists/groceries.txtEsistono diversi caratteri speciali:
~: la home directory dell’utente.: indica la directory corrente..: indica la directory padreÈ un interprete dei comandi che consente all’utente di richiedere informazioni e servizi al sistema operativo. Ne esistono di due tipi:
Noi utilizzeremo la shell testuale. In questa shell:
\r\nIn bash il prompt ha questa forma:
username@host:directoryAttuale$
# Il dollaro compare solo se si è utente semplice
# Per utente di root si ha il carattere `#`
Per effettuare il logout dalla shell testuale si può utilizzare la combinazione Ctrl+D o utilizzare il comando:
exit
Alcune funzioni utili sono:
TABCtrl+RCtrl+Alt+T (non su Manjaro per qualche motivo)Per spegnere e riavviare il pc, il root (su Manjaro anche non il root):
sudo shutdown -h now # Spegnere adesso
sudo shutdown -r now # Riavviare il sistema
Per cambiare directory:
cd /lib # Path assoluto
cd ./lib # Path relativo, lo elabora dalla locazione attuale
cd .. # Torno indietro (tranne se già nella cartella di root `/`)
cd # Torno a `~` (va bene anche `cd ~`)
Per ottenere il percorso assoluto della directory corrente si può utilizzare il comando:
pwd
Per mostrare il contenuto della directory specificata:
ls # directory corrente
ls qualche_directory # contenuto di qualche_directory
La maggior parte delle shell utilizza colori diversi per elencare diversi tipi di file. Lo standard per shell bash:
Il comando ls permette alcune opzioni (che possono essere concatenate):
-l mostra più dettagli sui file-a mostra tutti i file, anche quelli nascosti (su sistemi UNIX sono quelli che iniziano con il carattere .)-lH mostra più dettagli e scrive le dimensioni in maniera human readable-ll: equivalente a -laPer indicare i path è possibile utilizzare delle wildcards, ovvero caratteri regex che permettono di generalizzare la ricerca:
* sostituisce zero o più caratteri? sostituisce un carattere[a,b,c]: sostituisce un carattere con quelli specificati[a-z]: sostituisce un carattere con quello nel range a-zPer visualizzare il funzionamente di un comando:
man nome_comando
Il manuale è diviso in sezioni, e funziona per:
Se ci sono ambiguità si utilizza l’indice numerico:
man printf # comando bash
man 3 printf # funzione C
Per visualizzare la descrizione breve di una pagina del manuale si può utilizzare whatis.
Per gestire file (file) e directory (dir):
mkdir nome_cartella # crea una directory
rmdir nome_cartella # elimina una directory SOLO SE vuota
cp file dst # copia file in dst
cp file1 file2 ... dst_dir # copia file1, file2, ... nella directory dst_dir
cp -r dir1 dir2 ... dst_dir # copia le directory dir1, dir2, ... nella directory dst_dir
mv src dst # sposta src in dst se esiste come directory, altrimenti lo rinomina
mv src1 src2 ... dst_dir # sposta src1, src2, ... in nella directory dst_dir
touch file # Aggiorna il timestamp di accesso e modifica di un file. Se il file non esiste lo crea
cat file1 file2 ... # Concatena il contenuto di più file e lo stampa nello standard output
rm file1 file2 ... # Elimina file
rm -r dir1 dir2 ... # Elimina le cartelle e tutto il suo contenuto
less # Mostra un file "un po' alla volta" interattivamente
head # Mostra la prima parte di uno o più file
tail # Mostra l'ultima parte di uno o più file
head e tail prendono i modificatori:
-c: permette di specificare il numero di Byte-n: permette di specificare il numero di righeI processi hanno tre canali di input/output standard:
stdin: input da tastierastdout: output su schermostderr: messaggi di errore su schermoÈ possibile deviare l’output di un comando verso un file tramite operatore >:
ls -l > filelist.txt # Se non esiste è creato, se esiste è completamente sovrascritto
ls -l 2> filelist.txt # Come sopra, ma per lo stderr
ls -l &> filelist.txt # Come sopra, ma per entrambi
# I seguenti sono equivalenti a quelli sopra, ma effettuano append invece di overwrite
ls -l >> filelist.txt
ls -l 2>> filelist.txt
ls -l &>> filelist.txt
# Si possono combinare
ls -l > filelist.txt 2> errors.txt
Oppure prendere l’input da un file tramite operatore <:
sort < list.txt # Ordina gli elementi dati gli input nel file
I due operatori di ridirezione si possono combinare:
sort < list.txt > sortedList.txt
Per collegare l’output di un comando all’input del successivo si utilizza l’oepratore di pipe |:
ls -l mydir | less
cat *.txt | sort > result-file.txt
Il primo è su, che permette di accede al terminale di un’altro utente, previo inserimento della password dell’utente desiderato:
su alice # terminale di alice
su # terminale di root
Per lanciare un comando come un altro utente si utilizza il comando sudo (super user do). Richiede la password dell’utente corrente:
sudo utente comando
sudo comando
Questo comando può essere utilizzato solo da utenti nel gruppo sudoers (li primo utente vi è inserito automaticamente).
viEcco un lista di comandi per l’editor di testo da terminale vi/vim:
| Comando | Descrizione |
|---|---|
Esc |
Passa in modalità comandi |
i |
Passa in modalità inserimento nella posizione corrente |
v |
Passa in modalità visualizzazione. Permette di selezionare più caratteri |
o |
Inserisce una nuova linea dopo quella corrente |
x |
Cancella il carattere corrente |
u |
Annulla l’ultimo comando sulla linea corrente |
r? |
Sostituisce con ? il carattere su cui si trova il cursore |
dd |
Cancella la riga corrente |
ndd |
Cancella n righe a partire da quella corrente |
yy |
Copia una riga |
nyy |
Copia n righe a partire da quella corrente |
p |
Incolla la selezione nella riga sotto il cursore |
/word |
Ricerca nel testo la parola word |
n |
Si posizione sull’occorenza successiva (nella ricerca) |
N |
Si posizione sull’occorenza precedente (nella ricerca) |
:q |
Esce (se non si sono fatte modifiche) |
:wq o x |
Salva ed esce |
:q! |
Esce senza salvare |
:help |
Apre l’aiuto in linea |
Il primo strumento che andiamo a vedere è il comando find.
Questo comando permette di trovare file e cartelle all’interno del sistema.
Utilizza una sistassi relativamente complessa, ma questo gli permette di effettuare la ricerca combinando dei test sulle proprietà dei file, che siano filename, file type, owner, permessi, timestamp,…
È importante evidenziare che la ricerca non è influenzata dal contenuto del file.
Il comando find permette di eseguire delle actions (comandi) sui file trovati.
La sintassi è la seguente:
find [path1...] [espressione]
Il path permette di specificare uno o più percorsi. La ricerca avverrà soltanto nei percorsi specificati. L’espressione descrive come vengono trovati i file e quali azioni devono essere eseguite su di essi.
Le espressioni sono composte da una sequenza di elementi:
true o falsetrue se hanno successotruetrueGli elementi di una espressioni sono collegati da operatori, ad esempio -o indica OR e -a indica AND. In caso non siano specificati operatori, l’utilizzo dell’operatore AND è implicito per collegare due espressioni. Per negare una espressione il carattere ! rappresenta il NOT.
Vediamo alcuni test di utilizzo:
find . -name pattern: ricerca basata sul nome del file. Il pattern può includere i metacaratteri oppure le parentesi e, per evitarne l’espansione, è neccesario scriverli tra apici.find . -type dfl: ricerca basata sul tipo di file. d indica le directory, f i regular files e l i symbolic linkfind . -size [+-]n[ckMG]: permette di effettuare ricerche basate sulla dimensione del file. Il prefisso [+-] indica se il file deve essere maggiore o minore della dimensione specificata. n indica la dimensione e [ckMG] indica l’unità di misura utilizzata. In ordine byte, kilobyte, megabyte e gigabytefind . -user utente: si cercano i file appartenenti ad un utente come UID o come usernamefind . -group gruppo: si cercano i file appartenenti ad un gruppo come GID o come groupnamefind . -perm [-/] mode: si cercano i file a seconda dei permessi del file:
mode: i permessi devono essere esattamente quelli specificati-mode: almeno i permessi indicati devono essere presenti/mode: almeno uno dei permessi indicati deve essere presentePrima di vedere le azioni, è importante sottolineare che questi comandi vanno inseriti dopo i test, altrimenti avranno effetto su tutti i file:
-delete: elimina i file trovati. Ritorna true in caso di successo-exec command \;: esegue il comando command specificato sui file trovati. Tutti gli argomenti specificati dopo command vengono considerati come argomenti del comando, fino al carattere \;. La stringa {} è utilizzata per specificare il nome del file attualmente processato. Il comando viene eseguito a partire dal percorso di partenza.Un esempio di find che:
pippolist.txtfind . -size 10M -perm -u=w -user pippo -exec echo {} >> list.txt \;
locate [options] file1 file2 ....
Permette di ricercare un file specificato sfruttando un database aggiornato periodicamente dal sistema. È possibile forzare l’aggiornamento del database tramite comando sudo updatedb.
È più semplice da utilizzare e più veloce rispetto alla find. Tuttavia, mentre la find fornisce sempre risultati aggiornati, la locate potrebbe non avere ancora aggiornato il database, non fornendo alcun match.
Inoltre find, oltre a fornire supporto per test e azioni, è installato di default, mentre locate no.
Il comando grep (General Regular Expression Print) permette di cercare il uno o più file di testo le linee che corrispondono ad espressioni regolari o stringhe letterali.
grep [opzioni] [-e] modello [-e modello2...] file1 [file2...]
Se si vuole specificare più di un modello si deve utilizzare -e prima di ciascun modello, incluso il primo.
| Opzione | Significato |
|---|---|
-i |
Ignora le distininzioni tra minuscole e maiuscole |
-v |
Mostra le linee che non contengono l’espressione |
-n |
Mostra il numero di linea |
-c |
Riporta solo in conteggio delle linee trovate |
-w |
Trova solo parole intere |
-x |
Linee intere |
È possibile specificare dove la stringa/espressione deve trovarsi all’interno di una riga:
^: deve trovarsi a inizio riga$: deve trovarsi a fine riga[]: permettono di definire set di caratteri ammessi.: indica qualsiasi carattere*: indica che può essere ripetuta zero o più volte\: carattere di escapeIl comando tar (Tape ARchive) permette di archiviare/estrarre una raccolta di file e cartelle
tar modalità[opzioni] [file1...]
La modalità specifica il modo in cui il comando deve operare, le opzioni permettono di fornire ulteriori dettagli sul comportamento tecnica di compressione (nome dell’archivio, …)
La lista di file/cartelle indica quali devono essere archiviati o estratti
Il formato del file creato dipende dalla compressione eventualmente utilizzata:
.tar: non è stata utilizzata compressione.tar.gz: l’archivio è stato compresso con gz.tar.bz2: l’archivio è stato compresso con bzip2Subito dopo il comando tar deve essere specificata la modalità:
| Simbolo Modalità | Significato |
|---|---|
A |
Aggiunge file .tar all’archivio |
c |
Crea un nuovo archivio |
d |
Trova le differenze tra l’archivio e il filesystem |
--delete |
Cancella un file all’archivio |
r |
Aggiunge un file all’archivio |
t |
Elenca i file di un archivio |
U |
Aggiunge due file all’archivio, ma solo se differiscono dalla copia eventualmente già presente |
x |
Estrae i file dall’archivio |
Le opzioni invece permettono di definire il modo in cui il comando deve operare:
| Simbolo Modalità | Significato |
|---|---|
v |
Modalità verbose |
z |
Compressione con gzip |
j |
Compressione con bzip2 |
f |
Permette di specificare il nome dell’archivio |
Alcuni esempi:
tar cvf archivio.tar percorso # crea un archivio di nome `archivio.tar` con il contenuto `percorso` in modalità verbose
tar czf archivio.tar.gz percorso # crea un archivio compresso di nome `archivio.tar.gz` con il contenuto `percorso`
tar tf archivio.tar # mostra il contenuto dell'archivio `archivio.tar`
tar xvf archivio.tar file # estrae `file` da `archivio.tar` in modalità verbose
Se si devono comprimere file o archivi creati precedentemente con tar possiamo utilizzare:
gzip file1 file2 # comprime e salva i file con lo stesso nome e estensione `.gz` senza eliminare gli originali
gunzip file1.gz file2.gz # estrae i file compressi in file con lo stesso nome (senza estensione della compressione). Gli origniali vengono eliminati
bzip2 e bunzip2 utilizzano la stessa sintassi ma utilizzano l’algoritmo bzip2