sh vs bash: un riassunto
Se state leggendo questo articolo, c’è una buona probabilità che abbiate incontrato i termini shell, sh, bash ecc. in passato. Questi termini possono confondere e poiché sono strettamente correlati, il problema è ancora più grave. Così ho deciso di scrivere questo post con l’obiettivo di provare a spiegare le differenze tra loro.
Shell vs Kernel
Prima di andare avanti è importante capire cosa significano i termini shell e kernel.
Kernel
Il kernel è il centro del sistema operativo. È responsabile di fare cose come interagire con l’hardware, fare I/O su file e generare processi.
Shell
La shell funge da interfaccia tra l’utente e il kernel. Tecnicamente parlando, una shell è un interprete della linea di comando, cioè il programma che interpreta il comando inserito nell’emulatore di terminale (modalità interattiva) o elabora gli script di shell (file di testo contenenti comandi).

Ora che abbiamo un’idea di cosa siano la shell e il kernel, possiamo provare a capire sh e Bash.
sh
In senso stretto, sh (o il linguaggio dei comandi della shell) è un linguaggio di programmazione descritto dallo standard POSIX. La chiave qui è che sh non è realmente un linguaggio di programmazione in sé. È solo una specifica. La specifica è una descrizione dettagliata della sintassi e della semantica di quel linguaggio. La specifica non include un’implementazione.
Bash
Ci sono diversi sistemi operativi con le proprie shell e kernel. Bash è la shell del sistema operativo GNU. Ma possiamo anche dire che bash è un linguaggio di programmazione.
Aspetta, non ti confonde? Bash è sia una shell che un linguaggio di programmazione?
Pensate a Python. Possiamo anche avviare Python in modalità interattiva e si comporta come una shell. O JavaScript, o Ruby o qualsiasi linguaggio di scripting.

Ha senso?
Quindi bash è un linguaggio di programmazione che può essere pensato come un’implementazione di sh (anche se questo è cambiato nel tempo).
Per riassumere, sh è una specifica, bash è l’implementazione.