Esistono più programmi che implementano la lingua di /bin/sh
. Su Ubuntu, /bin/sh
è dash, progettato per essere veloce, per utilizzare una piccola quantità di memoria e non supporta molto più del minimo previsto /bin/sh
. Su RHEL, /bin/sh
è bash, che è più lento e utilizza più memoria ma ha più funzionalità. Una di queste funzionalità è l' ==
operatore per la [
sintassi condizionale. Dash supporta [
, che è una funzione sh di base, ma non ha l' ==
operatore che è un'estensione bash (e ksh e zsh).
Puoi cambiare il tuo sistema usando bash. Su Ubuntu, /bin/sh
c'è un collegamento simbolico a dash
. Puoi invece renderlo un collegamento simbolico bash
. Le versioni attuali di Debian e Ubuntu (e derivati) rendono questa opzione di installazione di dash. Per cambiarlo, corri
sudo dpkg-reconfigure dash
e rispondi "sì" per mantenere il trattino come /bin/sh
o "no" per passare a bash.
Puoi continuare con bash /bin/sh
, ma renderà il tuo sistema un po 'più lento. È anche ipotizzabile che alcuni script di sistema siano incompatibili con bash, sebbene ciò sia improbabile poiché bash è principalmente un superset di dash.
Per le distribuzioni che non hanno un'interfaccia tra cui scegliere tra le implementazioni /bin/sh
, ecco come passare a bash.
sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh
Tieni un terminale aperto e verifica che dopo puoi ancora eseguire alcuni sh
script. Se confondi questo comando, renderai il tuo sistema inutilizzabile. (A proposito, il motivo per cui ho usato i comandi multipli sopra piuttosto che quelli semplici sudo ln -sf bash /bin/sh
è che ln -sf
non è atomico. Nel caso in cui è improbabile che il tuo computer si sia arrestato in modo anomalo durante questa operazione, dovrai ripristinarlo da un supporto di ripristino. Al contrario, mv
è atomico.)
Per ripristinare il trattino come /bin/sh
:
sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh
Nota che se sh è /bin/bash
di default nella tua distribuzione, il passaggio a dash potrebbe causare errori negli script, poiché bash ha molte più funzioni rispetto a dash. Gli script Bash dovrebbero iniziare con #!/bin/bash
, e gli script che iniziano con #!/bin/sh
non dovrebbero usare funzionalità specifiche di bash, ma le distribuzioni fornite con bash /bin/sh
potrebbero utilizzare funzionalità specifiche di bash in #!/bin/sh
script specifici per quella distribuzione (va bene finché non ci si aspetta che gli utenti può passare al trattino come /bin/sh
e non ci sono aspettative che questi script funzionino su un'altra distribuzione).
==
che dovrebbe essere=
. Quello e che le espansioni variabili dovrebbero essere racchiuse tra virgolette.