Corso Linux Base – Lezione 1
Linux Shell
Le moderne distribuzioni Linux hanno una vasta gamma di interfacce grafiche, ma un utente avanzato dovrà sempre sapere come lavorare con la riga di comando o con la shell preferita.
La shell è un programma che consente la comunicazione testuale tra il sistema operativo e l’utente. Di solito è un programma in modalità testo che legge l’input dell’utente e lo interpreta come comandi.
Esistono diverse shell su Linux, queste sono solo alcune:
- Bourne-again shell (Bash)
- C shell (csh o tcsh, la csh migliorata)
- Korn shell (ksh)
- Z shell (zsh)
Su Linux la più comune è la Bash shell. Questa è anche quella che utilizzeremo in questo corso. Quando si utilizza una shell interattiva, l’utente immette i comandi al cosiddetto prompt. Per ogni distribuzione Linux, il prompt predefinito può apparire leggermente diverso, ma di solito segue questa struttura:
username@hostname current_directory shell_type
Su Ubuntu, Debian GNU / Linux o Raspbian, il prompt per un utente normale sarà probabilmente simile a questo:
carol@mycomputer:~$
Il prompt dell’utente root (amministratore) sarà simile al seguente:
root@mycomputer:~#
Su CentOS o Red Hat Linux, il prompt per un utente normale e per un utente root saranno invece simili ai seguenti:
[dave@mycomputer ~]$
[root@mycomputer ~]#
Spieghiamo ogni componente della struttura del prompt:
- username: nome dell’utente che esegue la shell nome
- hostname : nome dell’host su cui viene eseguita la shell. C’è anche un comando hostname, con il quale puoi mostrare o impostare il nome dell’host di sistema.
- current_directory: la directory in cui si trova attualmente la shell.
- ~ significa che la shell si trova nella directory home dell’utente corrente.
- $ indica che la shell è gestita da un utente normale.
- # indica che la shell viene eseguita dall’utente root (amministratore).
Poiché non abbiamo bisogno di privilegi speciali, utilizzeremo un prompt senza privilegi nei seguenti esempi. Per brevità, useremo semplicemente $ come prompt.
Struttura dei Comandi
La maggior parte dei comandi seguono la stessa struttura base
command [option(s)/parameter(s)...] [argument(s)...]
Prendi come esempio il seguente comando
$ ls -l /home
Spieghiamo nel dettaglio i vari componenti
- Command: Programma che l’utente eseguirà – come nell’esempio sopra.
- Option (s) / Parameter (s) Un valore che modifica in qualche modo il comportamento del comando, come -l nell’esempio sopra. È possibile utilizzare i parametri e le opzioni in maniera breve e lunga. Ad esempio, -l è identico a –format = long. È inoltre possibile combinare più opzioni e, in forma abbreviata, le lettere possono in genere essere digitate insieme. Ad esempio, i seguenti comandi fanno tutti la stessa cosa:
$ ls -al
$ ls -a -l
$ ls --all --format=long
- Argument(s): Dati aggiuntivi richiesti dal programma, come un nome file o percorso, come / home nell’esempio sopra.
Tipi di Comando
La shell supporta due tipi di comandi:
- Interno: questi comandi fanno parte della shell stessa e non sono programmi separati. Esistono circa 30 comandi di questo tipo. Il loro scopo principale è quello di eseguire attività all’interno della shell (ad esempio cd, set, export).
- Esterno: questi comandi risiedono in singoli file. Questi file sono generalmente programmi o script binari. Quando viene eseguito un comando che non è incorporato nella shell, la shell utilizza la variabile PATH (che contiene i percorsi di sistema dove si possono trovare i programmi o gli script) per cercare un file eseguibile con lo stesso nome del comando. Oltre ai programmi installati con il gestore dei pacchetti della distribuzione, gli utenti possono anche creare i propri comandi esterni. Il comando type mostra che tipo è un comando specifico:
$ type echo
echo is a shell builtin
$ type man
man is /usr/bin/man
Apici
Come utente Linux, dovrai creare o manipolare file e variabili in vari modi. Questo è facile quando si lavora con nomi di file brevi e con singole parole, ma diventa più complicato quando, ad esempio, sono coinvolti spazi, caratteri speciali e variabili. La shell fornisce una funzione chiamata quoting che incapsula i caratteri speciali (spazi, etc.) utilizzando vari tipi di apici (“”, ”).
In Bash esistono tre tipi di quoting:
- Apici doppi
- Apici singoli
- Caratteri di escape
Apici Doppi
Le virgolette doppie indicano alla shell di inserire il testo tra le virgolette (“…”) come caratteri regolari. Tutti i caratteri speciali perdono il loro significato, tranne $, \ e `. Ciò significa che è ancora possibile utilizzare variabili, comandi e funzioni aritmetiche. Ad esempio, la sostituzione della variabile $ USER non è influenzata dalle virgolette doppie:
$ echo I am $USER
I am tom
$ echo "I am $USER"
I am tom
Utilizzando le doppie virgolette lo spazio perde il suo significato come separatore di argomenti
$ touch new file
$ ls -l
-rw-rw-r-- 1 tom students 0 Oct 8 15:18 file
-rw-rw-r-- 1 tom students 0 Oct 8 15:18 new
$ touch "new file"
$ ls -l
-rw-rw-r-- 1 tom students 0 Oct 8 15:19 new file
Come puoi vedere dal successivo comando ls -l, il primo comando touch crea due singoli file, questo perchè touch interpreta le due stringhe come singoli argomenti. Nel secondo esempio, il comando touch interpreta entrambe le stringhe come un unico argomento, quindi crea solo un file.
Tuttavia, è buona prassi evitare il carattere spazio nei nomi dei file. E’ consigliato invece utilizzare un trattino basso (_) o un punto (.).
Apici Singoli
Le virgolette singole non hanno le eccezioni delle virgolette doppie. Revocano qualsiasi significato ai caratteri speciali. Prendiamo come esempio il seguente comando (la variabile $USER contiene l’utente attualmente collegato tom):
$ echo I am $USER
I am tom
Con gli apici singoli il risultato cambia
$ echo 'I am $USER'
I am $USER
Il comando ora visualizza la stringa esatta senza sostituire la variabile.
Caratteri di escape
Possiamo usare i caratteri di escape per rimuovere il significato dei caratteri speciali.
Prendiamo sempre come esempio la variabile di sistema $USER (che contiene l’utente corrente in questo caso carol)
$ echo $USER
carol
Come vediamo che per impostazione predefinita, il contenuto della variabile viene visualizzato nel terminale. Tuttavia, se dovessimo inserire prima del simbolo del dollaro una barra rovesciata (\), il dollaro perderà il suo significato originale. Questo a sua volta non consentirà alla shell Bash di visualizzare il contenuto della variabile, ma interpreterà invece letteralmente il nome della variabile stessa:
$ echo \$USER
$USER
Come visto in precedenza, possiamo ottenere risultati simili a questo usando la virgoletta singola, che stampa il contenuto letterale di qualunque cosa ci sia tra le virgolette singole. Tuttavia, il carattere di escape funziona in modo leggermente diverso dando istruzioni a Bash di ignorare qualunque significato speciale possa avere il singolo carattere che precede. In questo modo è possibile ad esempio fare interpretare in maniera diversa solo alcuni dei caratteri speciali presenti in una stringa.