
Se usi un sistema operativo (OS) Microsoft, Apple o Linux, stai utilizzando script di shell, magari senza saperlo. Di fatto, interagisci con le shell ogni volta che avvii il tuo OS Linux.
Gli script di shell aiutano programmatori, data scientist e utenti comuni a risparmiare tempo ed evitare attività ripetitive grazie all'automazione. Per esempio, gli script possono effettuare backup giornalieri, installare patch, monitorare sistemi e attività ed eseguire audit di routine.
Le shell leggono comandi abbastanza intuitivi, adatti all'essere umano, e li trasformano in qualcosa che il sistema può comprendere.
Che cos'è una Shell?
Una shell è un tipo di programma per computer chiamato interprete della riga di comando che consente agli utenti Linux e Unix di controllare i propri sistemi operativi tramite interfacce a riga di comando. Le shell permettono agli utenti di comunicare in modo efficiente e diretto con i loro sistemi operativi.
La shell non è un'unica lingua di scripting ma, poiché usa alcuni comandi in linguaggio naturale, è facile da imparare anche senza un background di programmazione. Tuttavia, ogni dialetto di scripting della shell è considerato un linguaggio e, se prevedi attività più complesse, serve molta pratica.
La shell è uno dei modi più semplici per impostare l'automazione. Usando comandi Linux o Unix, offre a data scientist, DevOps e TechOps strutture di controllo condizionali e cicli per ripetere comandi.
Gli script di shell non hanno sempre lo stesso nome. Sh, Bash (il più comune), csh, e tesh sono tutti script di shell. Nel sistema operativo VM di IBM si chiamano EXEC; in DOS, i file batch sono script di shell.
Una shell ha due categorie: shell a riga di comando e shell grafiche. Le shell a riga di comando si usano tramite interfacce a riga di comando, in cui i sistemi ricevono input in comandi leggibili e poi mostrano l'output tramite le stesse interfacce.
Le shell grafiche usano un'interfaccia grafica (GUI) per eseguire interazioni e operazioni essenziali come aprire, chiudere e salvare file.
Ecco alcuni esempi di comandi di shell:
Per scoprire in quale directory ti trovi: pwd
Per trovare un comando nel manuale: man command
Per rendere un file di testo scorrevole: less file 1 oppure more file 1
Tipi di shell
Bourne Shell
Per quanto il nome possa suggerire altro, la Bourne shell non ha nulla a che vedere con spie e inseguimenti ad alta velocità. La Bourne shell, la seconda shell Unix più usata, è stata creata nel 1979 da Stephen Bourne ai Bell Labs. Come la sua predecessora, la Thompson shell, l'eseguibile di Bourne si chiama sh.
La Bourne shell è la shell predefinita del sistema operativo Solaris. Nonostante l'età, è ancora popolare per velocità e compattezza. Tuttavia, non è molto interattiva e non può richiamare la sua cronologia dei comandi. Inoltre, manca di espressioni logiche e aritmetiche.
I prompt di Bourne includono:
- Percorso completo del comando:
/bin/she/sbin/sh - Predefinito per utente non root:
$ - Predefinito per utente root:
#
command-line
La C shell, filename csh, e la sua predecessora filename tcsh, è un'altra shell Unix della fine degli anni '70. Fu creata da Bill Joy, allora studente laureato all'Università della California, Berkeley.
A differenza della Bourne shell, la C shell è interattiva e riconosce cronologia dei comandi e alias. Le C shell includono anche una sintassi delle espressioni simile al C e aritmetica integrata.
I prompt della command-line includono:
- Percorso completo del comando:
/bin/csh - Hostname predefinito per utente non root:
% - Hostname predefinito per utente root:
#
KornShell
La KornShell, filename ksh, è stata sviluppata nei primi anni '80 da David Korn ai Bell Labs. KornShell include molte delle funzionalità della C shell, ed è un super-set ed è quindi retrocompatibile con la Bourne shell.
La KornShell è più veloce della C shell. Esegue script della Bourne shell e offre array, funzioni e strumenti di manipolazione delle stringhe in stile C. Inoltre, include aritmetica integrata.
I prompt di KornShell includono:
- Percorso completo del comando:
/bin/ksh - Predefinito per utente non root: $
- Predefinito per utente root: #
GNU Bourne-Again shell
La GNU Bourne-Again, o Bash, è un'alternativa open source alla Bourne shell. È stata progettata da Brian Fox per il progetto GNU e rilasciata nel 1989. Non solo è pienamente compatibile con la Bourne shell, ma riprende molte delle migliori funzionalità di KornShell e C shell. La GNU Bourne-Again shell ha i tasti freccia mappati automaticamente per l'editing e il richiamo dei comandi.
I prompt della GNU Bourne-Again includono:
- Percorso completo del comando:
/bin/bash - Prompt predefinito per utente non root:
bash-x.xx$ - Predefinito per utente root:
bash-x.xx#
Cosa fa lo shell scripting
L'analogia è un po' semplicistica, ma immagina gli script di shell come l'autocompletamento per i programmatori. Invece di digitare i comandi uno alla volta, la shell usa sequenze di comandi in singoli script che l'utente può avviare con un semplice nome file nella riga di comando. Gli script di shell eseguono programmi, gestiscono il wrapping del testo e la manipolazione dei file.
Lo shell scripting può svolgere numerose attività, tra cui il monitoraggio (come l'uso del disco), l'esecuzione di backup, la creazione di strumenti a riga di comando, la manipolazione dei file, l'esecuzione di programmi, il collegamento tra programmi, l'esecuzione di batch, ecc.
Principali alternative alla shell
Nel sistema operativo VM di IBM si chiamano EXEC; in DOS, gli script di shell sono chiamati file batch. Sono sempre script di shell, però. Altri linguaggi di scripting, come Javascript, Python, Perl e TCL, sono anch'essi linguaggi di scripting. Non sorprende che i professionisti dell'informatica abbiano tutti i loro preferiti, e tra poco vedremo pro e contro delle shell.
Perché la Shell è così popolare?
La shell è comune su quasi ogni OS perché è efficiente e facilmente aggiornabile. Monitora il sistema del tuo computer ed esegue backup di routine senza che tu debba pensarci.
Non c'è bisogno di cambiare sintassi perché le sintassi e i comandi della shell sono identici a quelli inseriti nella riga di comando. Inoltre, è facile e veloce scrivere script di shell: si avviano rapidamente e sono facili da fare debug.
Quali sono gli svantaggi degli script di shell?
Gli script di shell possono essere soggetti a errori e difficili da diagnosticare quando si presentano problemi. Le shell non sono progettate per attività complesse o di grandi dimensioni e sono lente nell'esecuzione. Inoltre, offrono poche strutture dati e possono presentare difetti di sintassi o progettazione.
Quando è stata creata la Shell?
La prima shell è stata creata all'inizio degli anni '60 da Louis Pouzin, membro dello staff informatico del MIT. Il suo primo comando a riga di comando fu RUNCOM, che liberò gli informatici da attività ripetitive come compilare, aggiornare, rinominare e spostare.
Anche se Pouzin non era un esperto di linguaggi di programmazione, o forse proprio per questo, credeva che le righe di comando potessero essere un linguaggio a sé stante.
Entro la metà degli anni '60, Pouzin fece squadra con lo scienziato britannico Christopher Strachey. Strachey progettò un generatore di macro che servì da base per il linguaggio di comando di Pouzin, che girava su quello che all'epoca era il sistema operativo all'avanguardia Multics.
Come la Shell ha ottenuto il suo nome
Pouzin chiamò il suo nuovo linguaggio "shell" perché è lo strato più esterno dei sistemi operativi.
Funzionalità della Shell
Le shell sono popolari tra i programmatori perché sono concise. Questo non significa però che siano basilari. Offrono diverse funzionalità, tra cui:
Esecuzione in background
Uno dei maggiori vantaggi degli script di shell è che possono essere eseguiti in background. A seconda del comando, le shell possono essere eseguite in primo piano o in background. I processi in primo piano sono visibili sullo schermo e possono essere eseguiti solo in sequenza.
I processi in background non compaiono sullo schermo e possono essere eseguiti in modo non sequenziale. Per eseguire uno script di shell in background, basta aggiungere una e commerciale (&) alla fine dello script.
Sostituzioni con wildcard
Le sostituzioni con wildcard consentono ai sistemi di elaborare più di un comando alla volta o di trovare frammenti di frasi nei file di testo. Per esempio, * dice al sistema di corrispondere a qualsiasi stringa, anche vuota. ? corrisponde a un singolo carattere, [example] corrisponde a qualsiasi carattere ("example" è solo un esempio) e [1-9] (altro esempio) istruisce la shell a far corrispondere caratteri all'interno dell'intervallo.
Alias di comando
Gli alias della shell sono comandi scorciatoia. Alcuni alias sono una singola parola, altri una singola lettera. Per vedere l'elenco degli alias, basta inserire ·alias.
Cronologia dei comandi
Ci sono molti modi in cui le shell fanno risparmiare tempo e fatica, ma una funzionalità particolarmente comoda è la cronologia dei comandi. Invece di ridigitare i comandi, il comando history mostra tutti quelli usati durante la sessione.
Sostituzione dei nomi file
La sostituzione dei nomi file è anche nota come "globbing". Quando una parola contiene caratteri come ?, * o [, o inizia con ~, la shell vedrà la parola come un pattern e la sostituirà con un elenco alfabetico di nomi di file che corrispondono al pattern.
Redirezione input/output
La redirezione input/output (i/o) consente di scambiare lo standard input (stdin) e lo standard output (stdout) associandoli allo schermo, alla tastiera o a un file.
Pipe
Il piping della shell è un altro tipo di redirezione che invia l'output di un comando/processo/programma a un altro comando/processo/programma. Questo permette ai comandi/processi/programmi di operare simultaneamente e consente un trasferimento continuo dei dati senza dover passare dallo schermo o da file di testo temporanei.
Sostituzione di variabili nella shell
Quando la shell incontra un'espressione contenente caratteri speciali, traduce il codice in qualcosa di più riconoscibile per gli utenti. Questo processo si chiama sostituzione di variabili, o semplicemente variabili.
Le variabili sono usate anche dai programmatori più esperti. Se, per esempio, un programmatore non conosce i valori effettivi prima di eseguire un programma, può usare la variabile come segnaposto finché il codice non è pronto all'esecuzione.
Come variano le shell
Esistono due tipi principali di shell, "sh" e "bash". Entrambe funzionano all'interno del sistema operativo Unix. Shell è un nome generico per lo scripting in qualsiasi shell. Come suggerisce il nome, bash (Bourne Again Shell) è una shell migliorata ed estesa.
Bash usa aggiornamenti per maggiori funzionalità, supporta il controllo dei job, è più facile da usare rispetto a sh e supporta la cronologia dei comandi. Sh non supporta la cronologia; il suo scripting funziona in qualsiasi shell ed è più portabile.
Come la Shell è evoluta nel tempo
Nel corso degli anni, le shell sono evolute rimanendo più o meno le stesse. La Bourne shell è stato un grande passo avanti rispetto alla Thompson shell originale, ma molte delle funzioni originali restano. Ovviamente, computer e aspettative sono cambiati.
Potenzialmente ci sono tante shell quanti sono gli utenti; ma, in sostanza, ci sono due tipi di shell: a riga di comando o Bourne. Tutto il resto è un dialetto più che un linguaggio diverso.
Shell Unix
Le shell Unix sono le originali e sono ancora molto diffuse. Funzionano su Unix e sui sistemi operativi correlati a Unix, come i Mac.
command-lines
Le command-lines (csh) sono le shell Unix più comuni. Le command-lines eccellono nel lavoro interattivo, inclusi alias, cdpath, controllo dei job, path hashing, stack di directory, ecc. Offrono anche funzionalità di editing e cronologia.
Tenex command-line
La Tenex command-line (tcsh) è stata sviluppata da Ken Greer della Caregia Melo University. Tenex era considerata un miglioramento rispetto alla versione originale della command-line. A differenza dell'originale C, Tenex offre editing e completamento della riga di comando, tra le altre funzionalità. Nel 1981, tsch si fuse con csh.
Korn shell
Le Korn shell (ksh) sono un'altra shell Unix, ma sono una sorta di compromesso tra C e Bourne shell, con retrocompatibilità con quest'ultima. La Korn shell è stata sviluppata nei primi anni '80 da David Korn ai Bell Labs.
Bourne again shell
La Bourne Again shell (Bash) è una shell Unix open source scritta alla fine degli anni '90 da Brian Fox per il progetto GNU come upgrade della Bourne shell.
Shell esotiche
Sebbene siano tutte basate su C o Bourne shell, i programmatori hanno progettato centinaia, se non migliaia, di dialetti diversi. Alcuni sono utili, altri semplicemente divertenti.
Chi usa la Shell?
Quasi chiunque usi un computer trae beneficio dalla shell, ma è particolarmente utile per amministratori di sistema, persone DevOps, programmatori e data scientist. Le shell vengono usate per automatizzare attività e applicazioni, installare pacchetti, eseguire backup o ripristini e, naturalmente, per programmare.
Esempi di Shell
Le shell possono essere basilari o complesse quanto desidera l'utente. Un semplice saluto in bash, per esempio, è echo “hello $USER”, mentre script di shell complessi sono quasi illimitati. Ecco alcuni esempi di base:
Crea un file in bash con un editor adatto. Qui usiamo l'editor vi.
$ vi example.shPremi il tasto 'i' per iniziare a inserire il codice:
#!/bin/bash
valid=true
count=1
while [ $valid ]
do
echo $count
if [ $count -eq 10 ];
then
break
fi
((count++))
done
Esegui con
bash example.sh $vi example2.sh#!/bin/bash
echo "Enter first number"
read x
echo "Enter second number"
read y
((sum=x+y))
echo "The result of addition = $sum"
bash example2.shCarriere con la Shell
Più che un percorso di carriera, considera lo shell scripting come uno strumento utile nell'arsenale di un data scientist. I professionisti dei dati di ogni tipo devono conoscere più linguaggi (o almeno dovrebbero), e gli script di shell li aiutano a usare i linguaggi in modo più efficiente.
Detto questo, alcune aziende hanno ruoli che richiedono specificamente lo shell scripting. Il salario medio è intorno ai 78.000 dollari. Detto ciò, gli script di shell sono un mattone fondamentale per ruoli come gli amministratori di sistema, che possono arrivare a stipendi a sei cifre.
Conclusione
La shell è come un filo che attraversa ogni linguaggio di programmazione. Comandi complessi vengono ridotti a scorciatoie concise e intuitive. Capire la shell è una competenza importante per qualsiasi data scientist o ingegnere informatico. Scopri la shell nel corso di DataCamp Introduction to Shell.
Domande frequenti sulla Shell
Che cos'è il kernel?
Il kernel è la parte più essenziale del sistema operativo. È responsabile di allocare memoria e tempo ai programmi del computer e gestisce comunicazioni e archivio dei file in risposta alle system call.
Che cos'è la shell?
La shell è l'interfaccia tra il kernel e l'utente.
Quali sono i vantaggi della shell?
Sappiamo già che la shell è efficiente e si occupa di molte attività noiose dell'utente; oltre a questo, le shell permettono di personalizzare gli script in base alle proprie esigenze.
Quali sono gli svantaggi della shell?
Un singolo errore può risultare molto costoso e difficile da individuare. Inoltre, le shell non sono molto portabili tra sistemi operativi diversi.
Qual è la differenza tra Unix e Linux?
Linux è un clone di Unix sviluppato da Linus Torvalds. Linux non è di per sé un sistema operativo; è un kernel. Unix, invece, include il kernel, la shell e i programmi.
Quali shell sono comunemente usate sui sistemi Linux e Unix?
Bash, ovvero la Bourne Again shell, è la shell più comunemente usata, ma sia Linux che Unix supportano anche command-lines, KornShell e TCSH.
Che cos'è la sintassi della shell?
Nel linguaggio naturale, la sintassi si riferisce a come sono disposte parole e frasi. La sintassi della shell è molto simile; si riferisce all'ordine delle operazioni.
Che cos'è un interprete?
Un interprete traduce singole istruzioni in codice macchina.
Che cos'è un compilatore?
Un compilatore traduce programmi di alto livello in un linguaggio macchina più complesso.
Come si esegue un file di shell?
Imposta i permessi con: chmod+x script-name-here.sh
Poi eseguilo con: ./script-name-here.sh oppure sh script-name-here.sh.

