Che cos'è sh
sh(o Shell Command Language) è un linguaggio di programmazione descritto dallo standard POSIX . Ha molte implementazioni ( ksh88, dash, ...). bashpuò 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
bashiniziato come shun'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é bashnon è una shell POSIX valida. Piuttosto, è un dialetto del linguaggio shell POSIX.
bashsupporta uno --posixswitch, che lo rende più conforme a POSIX. Prova anche a imitare POSIX se invocato come sh.
sh = bash?
Per molto tempo, /bin/shusato per indicare /bin/bashsulla 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/shnon punta /bin/bash(e su alcuni dei quali /bin/bashpotrebbe anche non esistere) sono:
- Moderni sistemi Debian e Ubuntu, che si collegano
shper dashimpostazione predefinita a symlink ;
- Busybox , che di solito viene eseguito durante l'avvio del sistema Linux come parte di
initramfs. Utilizza l' ashimplementazione 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 shche per lungo tempo non era conforme a POSIX; un'implementazione gratuita è disponibile dal progetto Heirloom .
Come puoi scoprire cosa /bin/shindica il tuo sistema?
La complicazione è che /bin/shpotrebbe 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 -Lflag 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' -samefileopzione, 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/bashse è 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 shper 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.