Che cos'è sh
sh
(o Shell Command Language) è un linguaggio di programmazione descritto dallo standard POSIX . Ha molte implementazioni ( ksh88
, dash
, ...). bash
può anche essere considerata un'implementazione di sh
(vedi sotto).
Perché sh
è una specifica, non un'implementazione, /bin/sh
è un collegamento simbolico (o un collegamento reale) a un'implementazione effettiva sulla maggior parte dei sistemi POSIX.
Cosa è bash
bash
iniziato come sh
un'implementazione compatibile (anche se precede di alcuni anni lo standard POSIX), ma col passare del tempo ha acquisito molte estensioni. Molte di queste estensioni possono modificare il comportamento degli script shell POSIX validi, quindi di per sé bash
non è una shell POSIX valida. Piuttosto, è un dialetto del linguaggio shell POSIX.
bash
supporta uno --posix
switch, che lo rende più conforme a POSIX. Prova anche a imitare POSIX se invocato come sh
.
sh = bash?
Per molto tempo, /bin/sh
usato per indicare /bin/bash
sulla maggior parte dei sistemi GNU / Linux. Di conseguenza, era quasi diventato sicuro ignorare la differenza tra i due. Ma questo ha iniziato a cambiare di recente.
Alcuni esempi popolari di sistemi in cui /bin/sh
non punta /bin/bash
(e su alcuni dei quali /bin/bash
potrebbe anche non esistere) sono:
- Moderni sistemi Debian e Ubuntu, che si collegano
sh
per dash
impostazione predefinita a symlink ;
- Busybox , che di solito viene eseguito durante l'avvio del sistema Linux come parte di
initramfs
. Utilizza l' ash
implementazione della shell.
- BSD, e in generale qualsiasi sistema non Linux. OpenBSD usa
pdksh
, un discendente della shell Korn. FreeBSD sh
è un discendente della shell Bourne UNIX originale. Solaris ha il suo sh
che per lungo tempo non era conforme a POSIX; un'implementazione gratuita è disponibile dal progetto Heirloom .
Come puoi scoprire cosa /bin/sh
indica il tuo sistema?
La complicazione è che /bin/sh
potrebbe essere un collegamento simbolico o un collegamento reale. Se si tratta di un collegamento simbolico, un modo portatile per risolverlo è:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Se è un collegamento reale, prova
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
In effetti, il -L
flag copre sia i collegamenti simbolici che i collegamenti fisici, ma lo svantaggio di questo metodo è che non è portatile - POSIX non richiede find
di supportare l' -samefile
opzione, sebbene sia GNU find sia FreeBSD find lo supportino.
Linea Shebang
Alla fine, spetta a te decidere quale usare, scrivendo la riga «shebang» come prima riga della sceneggiatura.
Per esempio
#!/bin/sh
utilizzerà sh
(e qualunque cosa accada),
#!/bin/bash
userà /bin/bash
se è disponibile (e fallirà con un messaggio di errore se non lo è). Naturalmente, puoi anche specificare un'altra implementazione, ad es
#!/bin/dash
Quale usare
Per i miei script, preferisco sh
per i seguenti motivi:
- è standardizzato
- è molto più semplice e facile da imparare
- è portatile su tutti i sistemi POSIX - anche se non lo sono
bash
, devono farlosh
Ci sono anche vantaggi nell'utilizzo bash
. Le sue caratteristiche rendono la programmazione più conveniente e simile alla programmazione in altri linguaggi di programmazione moderni. Questi includono cose come variabili e array locali con ambito. Plain sh
è un linguaggio di programmazione molto minimalista.