Cosa fa#
Una shell e' un interprete di comandi — legge l'input dell'utente, lo interpreta e chiede al kernel di eseguirlo. Tutte le shell Unix implementano POSIX come contratto minimo, poi aggiungono estensioni proprie con sintassi e funzionalita' diverse.
TL;DR#
POSIX (contratto minimo comune)
│
├── sh → implementazione minima, universale
├── dash → minima + ottimizzata per velocita'
├── bash → POSIX + molte estensioni
├── zsh → POSIX + bash-like + ancora di piu'
└── fish → non POSIX, sintassi propriaLe shell principali#
sh — Bourne Shell#
La shell originale di Unix, scritta da Stephen Bourne nel 1979. Oggi "sh" e' quasi sempre un alias a dash o bash in modalita' compatibile.
#!/bin/sh
# POSIX puro — gira ovunque
for i in $(seq 1 10); do
echo $i
donedash — Debian Almquist Shell#
Implementazione minimale di sh, ottimizzata per velocita'. Ubuntu usa dash come /bin/sh di default per il boot — eseguire centinaia di script di sistema con dash invece di bash e' misurabilmente piu' veloce.
Dimensione: ~150KB
Velocita': molto veloce
Funzioni: POSIX puro, niente estensioni
Dove: /bin/sh su Ubuntu, Debian, Alpinebash — Bourne Again Shell#
La shell piu' diffusa su Linux. E' un superset di POSIX — implementa tutto lo standard piu' molte estensioni comode.
#!/bin/bash
# bash-specific — non funziona in sh/dash
for i in {1..10}; do # brace expansion
echo $i
done
array=(uno due tre) # array
echo ${array[0]} # indicizzazione array
[[ "$var" =~ ^[0-9]+$ ]] # regex matching con ```
```bash
Dimensione: ~1MB
Velocita': piu' lento di dash
Funzioni: POSIX + array + [[ + {..} + process substitution + ...
Dove: default su Ubuntu, Kali, macOS (fino a Catalina)zsh — Z Shell#
Superset di bash con funzionalita' aggiuntive orientate all'interattivita'. Default su macOS da Catalina in poi. Oh My Zsh lo rende popolare tra gli sviluppatori.
# zsh-specific
autoload -U compinit && compinit # autocomplete avanzato
setopt HIST_IGNORE_DUPS # opzioni extra
print -P "%F{green}%~%f" # prompt colorato nativoDimensione: ~1.5MB
Velocita': simile a bash
Funzioni: POSIX + bash-like + autocomplete avanzato + temi + plugin
Dove: default macOS, popolare su desktop Linuxfish — Friendly Interactive Shell#
Scelta deliberata di non essere POSIX-compatible per avere una sintassi piu' pulita. Non usa $ per le variabili nei contesti normali, non ha if [ ] POSIX.
# fish — sintassi completamente diversa
for i in (seq 1 10) # no $(), no do
echo $i
end # no done
set nome "barno" # no = senza spazi
if test $nome = "barno" # no [ ]
echo "ciao"
endDimensione: ~3MB
Velocita': piu' lento
Funzioni: massima interattivita', autocomplete intelligente
Dove: scelta personale sviluppatori — non su server
Attenzione: gli script fish non girano su bash/sh e viceversaConfronto rapido#
| Shell | POSIX | Leggerezza | Interattivita' | Portabilita' script |
|---|---|---|---|---|
| sh | si | massima | minima | massima |
| dash | si | massima | minima | massima |
| bash | si + estensioni | media | buona | alta (dove c'e' bash) |
| zsh | si + estensioni | media | ottima | alta (dove c'e' zsh) |
| fish | no | bassa | ottima | nulla fuori da fish |
Quale usare?#
Script di sistema, cron, Docker → #!/bin/sh o #!/bin/dash
Script personali su Linux → #!/bin/bash
Script personali su macOS → #!/bin/zsh o #!/bin/bash
Terminale interattivo quotidiano → zsh o fish (comodita')
Ambiente embedded / container → sh o dash (dimensione)Perche' Ubuntu usa dash come /bin/sh#
# Su Ubuntu
ls -la /bin/sh
# /bin/sh -> dash
# Verificare
readlink -f /bin/sh
# /bin/dashAl boot, Ubuntu esegue centinaia di script in /etc/init.d/ e /etc/rc*.d/. Usare dash invece di bash riduce il tempo di boot in modo misurabile — dash e' piu' veloce nell'avvio e nel parsing degli script.
Dove l'ho incontrato#
- bandit-32 — escape con
$0— variabile POSIX universale - posix — lo standard che tutte implementano
Collegato a#
- system — categoria
- posix — lo standard comune
- shell-interattiva — login shell vs non-login shell
- bash-startup-files — file di startup specifici per shell


