Qual'è la differenza tra bash e sh?


28

Vedo due tipi di codice utilizzati:

#!/usr/bin/sh

e:

#!/user/bin/bash

Ho cercato questo online e le opinioni variano molto. Le spiegazioni che ho visto sulla maggior parte dei siti Web dicono che shè più vecchio di bashe che non c'è alcuna differenza reale.

Qualcuno conosce la differenza tra questi? Potete darmi un esempio pratico quando usare l'uno sull'altro?


per una panoramica generale sulle diverse shell (non solo she bash): http://it.wikipedia.org/wiki/Comparison_of_command_shells
akira

Risposte:


34

bashè un superset di shie. tutto ciò che puoi fare in shte può fare bash.

Bash ha più funzioni (branching, builtin, array) che facilitano la scrittura degli script. Alcuni * nix successivi hanno /bin/shcome link a/bin/bash

Per una spiegazione completa di ciò che è un tutorial


5
@Saif Bechan: Uno dei motivi per cui la shell Bourne ( sh) non è stata solo estesa è che Bash` è stato scritto da qualcun altro. Inoltre scommetto che c'erano problemi di licenza. Leggi l'articolo sulla Bourne Shell en.wikipedia.org/wiki/Bourne_shell
Felix

7
La rimozione shspezzerebbe molti script che si aspettano che ci siano e si basano sul modo in cui analizza le cose. Agli utenti Linux potrebbe non interessare, ma le persone che spendono $ $$ migliaia su Solaris, AIX o HP-UX potrebbero essere molto seccate.
njd,

3
... e ancora più divertente, collegamenti simbolici Ubuntu / bin / sh a dash. Dash non è completamente compatibile con sh o bash, ma dovrebbe avviarsi più velocemente. Quando il sistema si avvia, vengono eseguiti tutti gli script init.d e credo che ne valga la pena risparmiare tempo.
kbyrd,

8
Sono abbastanza sicuro che Dash sia completamente sh shiant. Il problema è che alcune persone scrivono script che dicono / bin / sh, ma lo script stesso richiede / bin / bash per funzionare. Nessuno nota un problema, perché la maggior parte delle volte / bin / sh indica semplicemente / bin / bash.
dav

8
@Saif: c'è un altro motivo per cui shnon è stato semplicemente esteso: il suo codice sorgente è un vero inferno. Guarda. Si suppone essere C ...
grawity

6

Tradizionalmente, / bin / sh sarebbe stata la shell Bourne originale, che non ha cronologia o modifica della riga di comando e nessun controllo del lavoro.

Per circa 15 anni circa, la maggior parte degli Unix ha installato la shell POSIX, o almeno ksh o bash (che sono quasi simili a POSIX), ma hanno ancora la shell più limitata in / bin / sh

La ragione di ciò è che gli script di shell più vecchi che prevedono il shcomando precedente continueranno a funzionare.
Dal momento che personaggi come {, }e !hanno un significato speciale per bash, è possibile che uno script di shell vecchio usando quei caratteri (senza fuga) potrebbe fallire.
(La shell Bourne prenderebbe alla !!{1,2}lettera, mentre bash lo interpreterebbe come una ripetizione del comando precedente ( !!) seguito da una parentesi graffa).

Su Linux, tuttavia, il shcomando è quasi sempre solo un collegamento a bash, con tutte le stesse funzionalità.


2
Bash dovrebbe comportarsi (ma non sempre) comportarsi in modalità sh-compatibilità se invocato come / bin / sh. Molte cose si sono interrotte quando Ubuntu è passato / bin / sh dal collegamento a / bin / bash al collegamento a / bin / dash. Le cose che si sono rotte hanno assunto basismi quando avrebbero dovuto usare lo sh standard.
Broam

4

sh può significare shell Bourne o / bin / sh, che è un'altra shell (conforme a POSIX) sulla maggior parte delle piattaforme moderne. "La shell POSIX" è la shell astratta definita da POSIX , che è implementata da bash in modalità POSIX, o ksh o dash di default. / bin / sh è talvolta chiamato anche shell POSIX, perché è una shell conforme a POSIX sulla maggior parte delle piattaforme. Le shell Bourne originali non sono shell POSIX.

bashref ha un elenco di differenze tra shell bash e Bourne . man bashha un elenco di modifiche quando viene invocato bash in modalità POSIX .

/ bin / sh non è un collegamento simbolico o hard link su OS X, ma ha quasi le stesse dimensioni di / bin / bash:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

uomo bash :

Se bash viene invocato con il nome sh, cerca di imitare il comportamento di avvio delle versioni storiche di sh il più vicino possibile, pur essendo conforme allo standard POSIX.

Al contrario, l'imitazione delle conchiglie Bourne è piuttosto limitata. bash +B(Bourne) disabiliterebbe effettivamente funzionalità come l'espansione del controvento.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

Ma anche se disabiliti la modalità POSIX, l'eco si comporta come echo -eper impostazione predefinita:

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / sh è un trattino su Ubuntu , quindi alcuni bashismi funzionano con / bin / sh su OS X ma non su Ubuntu.

Se in realtà si desidera scrivere script per (qualcosa del genere) delle shell Bourne originali, è possibile utilizzare #!/usr/bin/env bash +Binvece.

Penso che sia più facile scrivere script per bash che evitare funzionalità che non fanno parte delle specifiche POSIX o shell Bourne o testare tutto con altre shell.


2

In realtà, anche se / bin / sh può essere un collegamento a / bin / bash, se avviato come sh si comporta diversamente. Dalla manpage di bash:

Se bash viene invocato con il nome sh, cerca di imitare il comportamento di avvio delle versioni storiche di sh il più vicino possibile, pur essendo conforme allo standard POSIX.

Così sh, cerca di emulare il comportamento storico sh. Come bash, cerca di essere il più utile possibile come una shell di login interattiva.


2

Su molti sistemi e su Solaris in particolare, bash è collegato dinamicamente mentre sh è staticamente collegato. Ciò può costituire una minaccia per la sicurezza, per questo motivo l'utente root deve usare solo / bin / sh come shell (se è necessario accedere come root).


2
Inoltre può essere utile in caso di emergenza se hai fatto qualcosa di male ldconfigo se la tua /libdirectory è stata cancellata per qualche motivo.
LawrenceC,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.