Shell Linux: i comandi principali

Le persone che si approcciano per la prima volta alle distribuzioni Linux potrebbero ignorare del tutto l’esistenza della shell linux o dell’interprete dei comandi. Questo perché i moderni sistemi operativi fanno completamente affidamento sulle GUI (Graphical User Interface) moderne per ogni sorta di interazione tra utente e computer. Dunque oggi non è più obbligatorio apprendere una lista di comandi ben precisi per interagire con i vari applicativi o con i file presenti all’interno del disco fisso. Tuttavia risulta molto utile sapersi muovere all’interno del file system e apprendere almeno qualcuno dei comandi principali del terminale shell linux.

Anche se può sembrare superfluo sapersi destreggiare con le funzioni della CLI (Command Line Interface) è comunque molto interessante e di grande utilità. Avere una marcia in più e comprendere il funzionamento base della piattaforma che si sta utilizzando ci aiuta anche a snellire e a rendere più fluide talune procedure.

Spostarsi all’interno del file system Linux

Il file system è fondamentalmente quel meccanismo con cui il sistema operativo organizza ed archivia i file sul disco o su altre tipologie di memoria di massa. Gli utenti solitamente interagiscono con il file system tramite un programma chiamato File Manager , come esempio Finder su MacOS oppure Esplorare Risorse in Windows 10, che non fa altro che rappresentare con un’interfaccia user friendly il file system e le varie directory, che oggi comunemente indichiamo come “cartelle”, ovvero delle entità che sostanzialmente racchiudono ed elencano i file dell’utente.

file system linux

Muoversi tra le varie directory tramite la shell Linux non è complicato, anzi risulta essere molto più intuitivo di quanto si possa supporre. Prima di poter iniziare ad esplorare i vari comandi principali bisogna approfondire brevemente il concetto di file system, delle directory e scoprire come sono organizzati i file all’interno delle distribuzioni.

Su Linux praticamente tutti i file dell’utente e le relative configurazioni della sessione sono racchiuse dentro la home directory,  indicata graficamente dal terminale con questo simbolo “~“,  in modo tale da separarli nettamente dai dati del sistema. I componenti core della distribuzione invece vengono posizionati nella root directory, indicata dalla shell Linux cosi “/“.

Se quindi si è alla ricerca di qualche documento generato dall’utente tramite un applicativo allora ci si dovrà indirizzare verso la home, mentre se invece se si necessità di modificare un elemento del sistema in questo caso sarà necessario partire dalla root.

Comandi più usati nella shell Linux

Parte dei comandi da shell Linux sono ereditati direttamente da Unix e dagli standard POSIX (Portable Operating System Interface for Unix). Per iniziare ad approcciarsi col concetto di file system basta tenere a mente due comandi principali della shell Linux molto semplici, ovvero: cd ed ls.

Nella maggior parte dei casi le distribuzioni Linux adottano Bash, acronimo di Bourne Again Shell, come CLI di riferimento, questo perché risulta essere molto affidabile e versatile, tuttavia esistono diverse alternative online altrettanto valide.

Il primo viene usato per spostarsi tra le directory, dunque per posizionarsi dentro la cartella chiamata Documenti si deve digitare:

cd Documenti

Il secondo invece serve per listare i file contenuti all’interno della directory su cui siamo posizionati, ecco un output d’esempio:

enjoy@pcdesktop:~/Documenti$ ls
fattura.pdf scansione.jpg note.txt

Come è possibile notare il comando ls ci ha mostrato come risultato tutti i file presenti dentro Documenti.  Tuttavia da questa lista vengono esclusi i file e le cartelle nascoste. Per mostrare anche questi elementi bisogna aggiungere al comando l’opzione “-a

enjoy@pcdesktop:~/Documenti$ ls -a
fattura.pdf scansione.jpg note.txt .ricevute.odt .configurazioni

Ora poniamo il caso volessimo modificare con Nano, un editor di testi da shell Linux, il file invitati.txt presente dentro la directory Foto. Basta dare questa sequenza di comandi:

cd

cd Foto

nano invitati.txt

oppure:

cd ~/Foto

nano invitati.txt

oppure ancora:

nano ~/Foto/invitati.txt

Ovviamente anche in questa directory l’utente può visualizzare tutti i file presenti tramite ls:

enjoy@pcdesktop:~/Foto$ ls

invitati.txt FotoCompleanno

Creare, copiare, spostare ed eliminare file con shell Linux

Creare una nuova cartella e posizionarci dei file dentro è altrettanto semplice tramite mkdir ed mv. Il primo comando genera la nuova directory, mentre il secondo si occupa di spostare i file. Ecco un esempio concreto:

mkdir "NuovaCartellaImmagini"

mv foto1 foto2 foto2 ~/Foto/NuovaCartellaImmagini

Come è possibile notare tramite mv si va ad indicare non solo i file da spostare ma anche la relativa destinazione, che in questo è la cartella chiamata NuovaCartellaImmagini. Oltre che per i singoli file il comando mv viene impiegato anche per muovere intere cartelle, che in ambito Linux sono sempre considerati come file, ed il loro relativo contenuto:

mv NuovaCartellaImmagini ~/Documenti

Nel caso in cui volessimo fare una copia del file basta rivolgersi al comando cp:

cp foto1 foto2 foto2 ~/Foto/NuovaCartellaImmagini

oppure per copiare un’intera cartella:

cp NuovaCartellaImmagini ~/Documenti

Anche in questo caso oltre che il nome del file, o della directory, da copiare sarà sempre necessario indicare al terminale l’esatta posizione del file system dove posizionare la copia dei dati.

Eliminare un file è altrettanto semplice con il comando rm:

rm foto1

Mentre nel caso di una directory è necessario inserire l’attributo “-r“:

rm -r NuovaCartellaImmagini

Quando si usa il comando rm è sempre bene porre estrema attenzione sul nome del file e sul percorso esatto. Infatti se si esegue tale operazione con i poter di utente amministratore è possibile anche eliminare file vitali per il corretto funzionamento del sistema operativo.

sudo ed escalation dei privilegi ad utente amministratore 

Come abbiamo già detto il file system delle distribuzioni Linux divide nettamente i file dell’utente da quelli del sistema operativo. Tale suddivisione non è solo organizzativa ma prevede anche delle barriere d’accesso e di modifica dei dati presenti nella root. L’utente standard non ha dunque i poteri per modificare, cancellare o creare nuovi file dentro la root directory. Per farlo o dovrà eseguire il login come utente amministratore, possibilità che in certe distribuzioni è disattivata di base per motivi di sicurezza, oppure eseguire un escalation temporanea dei privilegi tramite il tool sudo, acronimo di substitute user do.

Sudo permette all’utente di ottenere i poteri di amministratore per un breve periodo di tempo, dopo aver inserito una password specifica, in modo tale da eseguire modificare ai file di sistema. Per fare un esempio concreto, ecco cosa succede se tentiamo di eliminare una cartella dentro la root senza i privilegi necessari:

enjoy@pcdesktop:/$ rm -r Foto
rm: cannot remove 'Foto': Permission denied

se invece usiamo sudo:

sudo rm -r Foto

L’operazione prosegue senza interruzioni da parte di Bash, che andrà a rimuovere il file desiderato.

grep e find: cercare file nel computer

Bash offre degli strumenti di ricerca molto potenti e precisi chiamati grep e find. Nel caso l’utente non riesca a trovare manualmente i propri file, o dei dati all’interno di essi, si potrà rivolgere a questi due comandi.

La sintassi è molto facile da padroneggiare. Poniamo il caso di dover cercare il documento fatture2021.pdf presente nel nostro computer:

find ~ -name fatture2021.pdf

/home/enjoy/Documenti/fatture2021.pdf

Con tale comando abbiamo dunque indicato alla shell Linux di cercare dentro la home directory, ma possiamo anche indicare una cartella più specifica, il file nominato, per mezzo dell’attributo -name, fatture2021.pdf. Bash dunque ha risposto indicato l’esatto percorso in cui reperire tale documento ovvero la directory Documenti.

find dispone di vari attributi con cui eseguire ricerche più dettagliate, ad esempio in base alla dimensione:

find ~/Video/Compleanno -size +1G

/home/enjoy/Video/Compleanno/filmato.mp4

/home/enjoy/Video/Compleanno/filmato3.mp4

/home/enjoy/Video/Compleanno/filmato5.mp4

In questo caso find ci ha listato tutto i filmati più grandi di 1GB presenti dentro la cartella Compleanno. Se invece ci interessa restringere il campo di ricerca ai video modificati o registrati nell’ultima settimana dobbiamo utilizzare l’attributo -mtime seguito dall’indicazione temporale in giorni:

find ~/Video/Compleanno -name '*.mp4' -mtime -7

/home/enjoy/Video/Compleanno/filmato7.mp4

/home/enjoy/Video/Compleanno/filmato8.mp4

/home/enjoy/Video/Compleanno/filmato9.mp4

Con tali attributi find ha elencato tutti i file video con estensione .mp4, tramite l’uso del carattere asterico posizionato prima dell’estensione, modificati negli ultimi 7 giorni.

Il comando grep può gestire ricerche similari ed inoltre è capace di ricercare dati all’interno dei file dell’utente:

grep "Mario Rossi" fattura.txt

Mario Rossi ha pagato 103€ il 01/01/2021

Con tale comando, senza dover aprire il documento, è possibile capire al volo se dentro il file fattura.txt è presente la dicitura Mario Rossi. Ovviamente con grep si possono fare ricerche del genere su più file contemporaneamente:

grep "Mario Rossi" fattura2.txt fattura3.txt fattura4.txt

Per estendere la ricerca a tutti i file presenti nella directory, e nelle relative sottodirectory, dovremo utilizzare l’attributo -R:

enjoy@pcdesktop:~/Documenti$ grep -R "Mario Rossi"
Fatture/fattureGennaio2021.txt:Mario Rossi ha pagato 103€ il 01/01/2021

Fatture/fattureGennaio2021.txt:Mario Rossi ha pagato 97€ il 14/01/2021

fatturamarzo2021.txt:Mario Rossi ha pagato 124€ il 27/03/2021

Con tale opzione verranno elencati il nome dei file, con la loro posizione precisa nel file system, che contengono il nominativo Mario Rossi.

Informazioni sull’hardware utilizzato

Tramite CLI l’utente può ottenere informazioni dettagliate sull’hardware presente sul computer in uso. Dati che posso tornare utili nel caso sia necessario installare qualche driver specifico o monitorare il corretto funzionamento di qualche device particolare.

Ad esempio con il comando lshw il sistema ci elenca le principali caratteristiche hardware del computer:

enjoy@pcdesktop:~$ lshw
pcdesktop
description: Computer
width: 64 bits
capabilities: smp
*-core
description: Motherboard
physical id: 0
*-memory
description: System memory
physical id: 0
size: 15GiB
*-cpu
product: Intel(R) Core(TM) i5-4690K CPU @ 3.50GHz
vendor: Intel Corp.
physical id: 1
bus info: cpu@0
capacity: 3501MHz
width: 64 bits

L’output ricevuto da lshw mostra dunque la tipologia del sistema, la quantità di RAM ed il modello di CPU. Con comandi similari Bash è capace di indicare con precisione anche la tipologia ed il modello esatto di periferiche installate sulle porte PCI ed USB del proprio PC:

enjoy@pcdesktop:~$ lspci

00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 03)
00:1f.2 USB Controller: Intel Corporation 82801BA/BAM USB Controller #1 (rev 03)
01:00.0 VGA compatible controller: NVIDIA Corporation GK104GLM [Quadro K5000M] (rev a1)

enjoy@pcdesktop:~$ lsusb

Bus 005 Device 001: ID 0000:0000
bDeviceClass 9 Hub
bDeviceProtocol 1 Single TT
iProduct 2 EHCI Host Controller

Bus 004 Device 006: ID 0a5c:2110 Broadcom Corp.
bDeviceClass 224 Wireless
bDeviceProtocol 1 Bluetooth
iProduct 2 BCM2045B
(Bus Powered)

Come è possibile notare lspic ed lsusb forniscono non solo il tipo di device installato sul sistema ma anche i dettagli del chipset implementato. Questo elemento consente all’utente di individuare con precisione il modello delle periferica installata, facilitando enormemente il lavoro di ricerca dei driver o di software compatibili.

Gestione dei processi e kill delle applicazioni

Le distribuzioni dispongono di diverse utility per poter monitorare e gestire i processi in esecuzione nel sistema. Una delle più note è top, un task manager da shell Linux che da accesso a tutta una serie di strumenti per tenere sotto controllo gli applicativi avviati dall’utente o dalla distribuzione.

davide@pcdesktop:~$ top

top - 18:58:01 up 15 min, 0 users, load average: 0.52, 0.58, 0.59
Tasks: 4 total, 1 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.9 us, 0.0 sy, 0.0 ni, 92.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 16334.3 total, 10589.6 free, 5520.8 used, 224.0 buff/cache
MiB Swap: 14228.4 total, 14064.3 free, 164.1 used. 10682.9 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 8940 320 272 S 0.0 0.0 0:00.09 init
9 root 20 0 8940 228 184 S 0.0 0.0 0:00.01 init
10 davide 20 0 18076 3596 3472 S 0.0 0.0 0:00.07 bash
41 davide 20 0 18904 2068 1452 R 0.0 0.0 0:00.01 top
481 davide 20 0 25388 4636 3904 S 1.0 0.0 0:00.03 mc

Il tool top non solo elenca i processi attivi, ed i relativi utenti che li hanno avviati, ma fornisce anche l’ID unico dell’applicativo, i dati sui consumi delle risorse e lo status delle applicazioni. Tramite l’ID numerico l’utente può terminare l’applicazione direttamente da terminale sfruttando il comando kill.

Ad esempio se si volesse chiudere forzatamente il file manager Might Commander, indicato con l’ID 481 su top, basterà digitare in Bash:

kill 481

Il comando kill è molto potente e va usato con attenzione perché, con i relativi poteri di utente amministratore, è capace di chiudere anche i programmi base del sistema operativo e dunque, potenzialmente, rendere la sessione di lavoro inutilizzabile fino al prossimo riavvio del computer.

Le distribuzioni Linux sono un ottimo punto di partenza per tutte quelle persone che vogliono muovere i primi passi in un sistema Unix-like e sperimentare con Bash o più in generale con la CLI.  Nonostante oggigiorno non sia essenziale sapersi destreggiare con il terminale tali conoscenze potranno essere molto utili per rendere il proprio workflow più snello ed efficiente. Concludendo sapersi muovere all’interno del file system di una Shell Linux e apprendere alcuni dei comandi principali può sembrare per certi aspetti anacronistico, ma è molto utile e al contempo funzionale.

contattaci