Skip to main content
  1. Concetti/

Shell - confronto e differenze

·4 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

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 propria

Le 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
done

dash — 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, Alpine

bash — 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 nativo
Dimensione: ~1.5MB
Velocita':  simile a bash
Funzioni:   POSIX + bash-like + autocomplete avanzato + temi + plugin
Dove:       default macOS, popolare su desktop Linux

fish — 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"
end
Dimensione: ~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 viceversa

Confronto rapido
#

ShellPOSIXLeggerezzaInterattivita'Portabilita' script
shsimassimaminimamassima
dashsimassimaminimamassima
bashsi + estensionimediabuonaalta (dove c'e' bash)
zshsi + estensionimediaottimaalta (dove c'e' zsh)
fishnobassaottimanulla 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/dash

Al 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
#

Related