1. Indice

2. Informazioni generali

Durante 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ì:

Esistono diversi caratteri speciali:

2.1. Shell

È 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:

In 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:

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):

Per indicare i path è possibile utilizzare delle wildcards, ovvero caratteri regex che permettono di generalizzare la ricerca:

Per visualizzare il funzionamente di un comando:

man nome_comando

Il manuale è diviso in sezioni, e funziona per:

  1. Comandi
  2. Funzioni del kernel
  3. Funzioni delle librerie C
  4. File di Configurazione

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:

2.2. Redirizione di IO

I processi hanno tre canali di input/output standard:

È 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

2.3. Comandi privilegiati

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).

3. Comandi vi

Ecco 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

4. Strumenti per la gestione dei file

4.1. Find

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:

Gli 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:

Prima di vedere le azioni, è importante sottolineare che questi comandi vanno inseriti dopo i test, altrimenti avranno effetto su tutti i file:

Un esempio di find che:

find . -size 10M -perm -u=w -user pippo -exec echo {} >> list.txt \;

4.2. Locate

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.

4.3. Grep

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:

5. Archiviazione e Compressione

5.1. TAR

Il 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:

Subito 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