Guida a Bash: introduzione, il manuale e i comandi base

15/05/2023

Bash (Bourne-Again SHell) è appunto l’interprete dei comandi predefinito nella maggior parte delle distro Linux (qualche anno fa lo era altrettanto su macOS, fintantoché su quest’ultimo non avvenne la transizione a zsh.

Bash fornisce una vasta gamma di funzionalità, tra cui l’autocompletamento, la manipolazione dei dati, nonché l’esecuzione di script personalizzati.yo

Aver usato questo potente strumento raramente, se non per niente (altamente improbabile se usate Linux), sicuramente non mette in risalto il suo potenziale, ma posso assicurarvi che con calma, tempo ed esperienza, il terminale di Linux diventerà il vostro migliore amico. Tengo a precisare che sempre su questo canale ho trattato in passato Fish, un’altra shell installabile su Unix. Il modo con cui le varie shell interpretano i comandi può essere differente, quindi non esiste un vero e proprio standard, fatta eccezione per le cose di base. Essendo comunque Bash la più diffusa, la guida si concentrerà su questa.

Il comando man

Conoscere tutti, ma proprio tutti, i comandi e cosa fanno le singole opzioni è chiaramente impossibile, motivo per cui internet e le varie guide online servono come il pane. Tuttavia, non c’è alcuna garanzia che sia sempre possibile usare internet, o perché non si ha fisicamente la possibilità di collegarsi a internet oppure perché si sta usando un sistema Linux in modalità testuale. In questi casi, vi è a disposizione un comodo manuale che può essere richiamato tramite il comando:

man <nome comando>

Questo comando non fa altro che visualizzare la manualistica inerente al comando che si sta specificando. A titolo di esempio, l’utilizzo del comando:

man ls

Consente di visualizzare una pagina in cui è specificato:

  • Il nome del comando;
  • La sintassi generale del comando;
  • La descrizione del comando ed eventuali comportamenti predefiniti. A titolo di esempio, il comando ls scritto così com’è visualizza il contenuto della directory corrente;
  • Eventuali flag che possono essere passati. A titolo di esempio, il comando ls -la consente di visualizzare le directory nascoste;
  • L’eventuale codice d’uscita inerente all’esito del comando. A titolo di esempio, per il comando ls:
    • Se viene ritornato 0, significa che il comando è stato eseguito correttamente;
    • Se viene ritornato 1, significa che si sono verificati dei problemi di ordine minore (es. impossibilità ad accedere ad una sottodirectory);
    • Se viene ritornato 2, significa che si sono verificati dei problemi di ordine maggiore (es. problemi con i flag).

Ci sono poi altre informazioni aggiuntive anche non direttamente associate alle funzionalità del comando. Si può scorrere la documentazione inerente al comando usando il tasto ENTER oppure con la rotellina del mouse. Per uscire dal manuale è sufficiente premere q.

Le sezioni del manuale

In verità, una sintassi che permette di selezionare con più granularità la manualistica inerente al comando cercato, precedendo il nome del comando da un numero compreso tra 1 e 9 (entrambi inclusi). Nella fattispecie si ha quindi:

man [1-9] <nome comando>

Questi nove valori fanno riferimento in particolare a delle sezioni alle quali un comando può appartenere. L’idea di selezionare in modo granulare la sezione in cui cercare il comando nasce perché su Linux un comando può indicare una singola funzione, così come può indicarne diverse, in base alla variante del medesimo. Infatti, le sezioni sono raggruppate in base all’ambito di azione e si hanno nella fattispecie:

  • Tutti i programmi eseguibili e i comandi base della shell;
  • Le chiamate al kernel Linux;
  • Le chiamate alle librerie, ad esempio le librerie standard di C;
  • I file speciali (in genere associati al percorso /dev);
  • I formati dei file e le convenzioni (es. /etc/passwd);
  • Giochi;
  • I pacchetti di macro e convenzioni;
  • I comandi per l’amministrazione riservati all’utente root;
  • Le routine non standard del kernel Linux.

A titolo di esempio, il comando sleep permette di ritardare l’esecuzione di qualcosa nella shell. A titolo di esempio:

sleep 3

Sarà necessario attendere 3 secondi prima di poter riscrivere qualcosa nella shell. Tuttavia, sleep è anche un’istruzione C, la quale permette di fare la stessa cosa, ma è documentata in un’altra sezione. Digitando infatti:

man -f sleep

Vengono stampate tutte le varianti del medesimo comando associate alle singole sezioni in cui queste si possono trovare. Scrivendo quindi:

man 1 sleep

Si visualizza la documentazione inerente al comando nella shell bash. Mentre scrivendo:

man 3 sleep

Si visualizza la documentazione inerente all’istruzione in linguaggio C. Anche man stesso ha un suo manuale ed è accessibile tramite:

man man

Cercare il nome di un comando

Fino a questo momento abbiamo assunto che il nome del comando fosse noto e l’unico interesse era appunto quello di approfondirne la funzionalità. Tuttavia, a volte proprio il nome del comando stesso può non essere noto e a quel punto torna utile cercare delle parole chiave che permettono di trovare delle opportune corrispondenze. A titolo di esempio, digitando:

man -k copy

Viene visualizzata una serie di comandi che consentono di copiare qualcosa, con la relativa sezione. A titolo di esempio, il comando cp, che è certamente quello più utilizzato per copiare file e directory su Linux è documentato nella prima sezione, appunto perché un comando base. Giusto per fare una piccola anticipazione, digitando:

man -k <comando> | grep <sezione>

Vengono visualizzati solo i comandi inerenti alla sezione specificata. Quindi, il comando:

man -k copy | grep 1

Permette di visualizzare i comandi della sezione inerente ai comandi base, i quali permettono di copiare qualcosa.

Comandi base

Fatta confidenza con la manualistica della shell, è opportuno ora introdurre i comandi base che in generale sono:

  • cd: consente di cambiare directory;
  • ls: consente di visualizzare il contenuto della directory corrente o di una directory specificata;
  • cp: consente di copiare un file o una directory da un percorso sorgente a uno di destinazione;
  • mv: consente di spostare un file o una directory e/o rinominarla;
  • chmod: consente di cambiare i permessi di un file o una directory;
  • chown: consente di cambiare il proprietario in termini di utente e gruppo di una directory.

Il comando ls

Il comando ls, anticipato precedentemente, consente di visualizzare il contenuto della directory corrente in cui ci si trova posizionati nella shell.

Naturalmente, è possibile aggiungere delle opzioni che permettono di arricchire o alterare la forma dell’output di questo comando. A titolo di esempio:

  • -a: include le directory i cui nomi iniziano con un puntino (per il file system di Linux sono nascoste);
  • -l: mostra le directory in un formato più completo, il quale contempla:
    • I permessi;
    • Il numero di collegamenti per quel file o directory;
    • L’utente proprietario e il gruppo proprietario;
    • La dimensione del file e della directory;
    • La data di ultima modifica;
  • -h combinato con -l permette di interpretare la dimensione del file e delle directory in un formato cosiddetto human, cioè interpretabile dall’uomo. In questo caso, le dimensioni sono infatti mostrate in kB anziché in byte.

Il comando cd

Il comando cd consente di cambiare la directory corrente specificando un:

  • Percorso relativo: il percorso della nuova directory rispetto a quella corrente;
  • Percorso assoluto: il percorso della nuova directory rispetto alla radice del file system.

La sintassi è la seguente:

cd <percorso>

Quindi, partendo da /home/xeeon, scrivere cd Scrivania oppure cd /home/xeeon/Scrivania permette di recarsi nella directory Scrivania. Gli alias .. e . fanno riferimento rispettivamente alla directory genitore e la directory corrente.

Il comando chmod

Prima di introdurre il comando chmod è opportuno soffermarsi su quella che è la modalità di rappresentazione dei permessi di un file o una directory tramite il comando ls -l. Si può infatti constatare che la struttura ha una sintassi di questo tipo:

drwxrwxrwx

In particolare, d viene mostrato se si tratta di una directory, altrimenti si ha al posto suo un trattino. I tre blocchi r-w-x sono i permessi di lettura, scrittura ed esecuzione rispettivamente associati all’utente proprietario, il gruppo proprietario e tutti gli altri eccetto i proprietari. Semplicemente, ciascuno di essi è un bit che viene impostato a:

  • 1 se quel permesso è abilitato;
  • 0 se quel permesso non è abilitato.

La modifica di questi permessi avviene appunto col comando chmod, la cui sintassi è la seguente:

chmod [opzioni] <nome file>

A titolo di esempio, per modificare il file pippo.txt in modo tale che chiunque possa leggerlo, scriverlo ed eseguirlo, si può procedere nel seguente modo:

chmod u=rwx,g=rwx,o=rwx pippo.txt

In particolare:

  • Il blocco u=rwx sta ad indicare i permessi per il proprietario abilitati a lettura, scrittura ed esecuzione per il proprietario;
  • Il blocco g=rwx è analogo a prima, ma per il gruppo;
  • Il blocco o=rwx è analogo a prima, ma per tutti eccetto proprietario e gruppo.

In realtà, chi ha già avuto modo di usare o vedere questo comando da qualche parte, difficilmente ha avuto a che fare con questa sintassi, ma bensì con una ancora più semplice, la quale prevede l’utilizzo di tre numeri. Per esempio, la versione semplificata di questo comando è:

chmod 777 pippo.txt

I tre numeri sono determinati dal fatto che ognuno di essi rappresenta un gruppo rwx, dove ogni gruppo di tre bit è convertito in forma decimale. Infatti, 777 significa 111 111 111, cioè i bit rwx sono impostati a 1 per tutte e tre le sezioni. A titolo di esempio, fare in modo che gli altri possano solo leggere comporta 111 111 100, cioè 774. A tale scopo è sufficiente convertire da binario a decimale i gruppi di tre bit.

Assegnazione ricorsiva dei permessi

Si possono impostare ad una directory i permessi in modo ricorsivo (alle sottocartelle e file nel seguente modo):

chmod -R 777 <directory>

Assegnazione dei permessi di esecuzione

A un file eseguibile devono essere sempre assegnati i permessi di esecuzione nel seguente modo:

chmod +x <file eseguibile>

Il comando chown

Il comando chown permette di cambiare il proprietario e il gruppo di un file o una directory. A tale scopo è sufficiente usare la seguente sintassi:

chown <nome utente>:<gruppo> <file>

Nel caso di una directory è opportuno effettuare la modifica in modo ricorsivo:

chown -R <nome utente>:<gruppo> <directory>

Il comando mkdir

Il comando mkdir consente di creare una nuova directory all’interno della directory corrente oppure in un percorso specificato. La sintassi è la seguente:

mkdir <directory>

Il percorso può essere specificato, sia rispetto alla directory corrente in forma relativa, che rispetto alla radice del file system in forma assoluta. Utilizzando il flag -p è possibile creare più directory con un singolo comando:

mkdir -p <directory 1> <directory 2>

Il comando cp

Il comando cp consente di copiare un file o una directory da un percorso a un altro. La sintassi è la seguente:

cp <file sorgente> <file destinazione>

Nel caso di una directory è opportuno aggiungere il flag -r, avendo quindi:

cp -r <directory sorgente> <directory destinazione>

Il comando mv

Il comando mv consente di spostare un file o una directory da un percorso a un altro. La sintassi è la seguente:

mv <file/directory sorgente> <file/directory destinazione>

Non è necessario specificare il -r qualora sia necessario spostare una directory. Inoltre, mv può essere utilizzato per rinominare un file o una directory, semplicemente specificando il nuovo nome come se fosse il percorso di destinazione. Esempio:

mv pippo pluto

Il comando rm

Il comando rm consente di rimuovere un file o una directory. La sintassi è la seguente:

rm <file>

Qualora si trattasse di una directory è opportuno specificare il flag -r, quindi si ha:

rm -r <directory>

Questi erano solo alcuni dei possibili comandi base per prendere confidenza col terminale di GNU/Linux. Vi invito a guardare il video per scoprire altro.

https://youtu.be/CEOsQaSG-uU