Qual è la differenza tra #! / bin / sh e #! / bin / bash?

210

se scrivo,

#!/bin/bash
echo "foo"

o

#!/bin/sh
echo "foo"

entrambi producono lo stesso risultato. Ho visto alcuni script che iniziano con #!/bin/sh o #!/bin/bash . C'è qualche differenza tra loro?

    
posta virpara 25.05.2012 - 05:59

3 risposte

176

bash e sh sono due shell differenti. Fondamentalmente bash è sh , con più funzioni e migliore sintassi. La maggior parte dei comandi funziona allo stesso modo, ma sono diversi.

Detto questo, dovresti realizzare /bin/sh sulla maggior parte dei sistemi sarà un collegamento simbolico e non invocherà sh . In Ubuntu /bin/sh utilizzato per il collegamento a bash , comportamento tipico sulle distribuzioni Linux, ma ora è stato modificato per collegarsi a un'altra shell chiamata dash . Vorrei usare bash , dato che è praticamente lo standard (o almeno il più comune, dalla mia esperienza). Di fatto, sorgono dei problemi quando uno script bash usa #!/bin/sh perché lo script-maker presume che il link sia a bash quando non deve essere.

Per maggiori informazioni, link , link .

    
risposta data reverendj1 25.05.2012 - 06:08
62

Su Linux e altri sistemi simili a Unix puoi scegliere tra più shell.

La shell è responsabile non solo del disegno del tuo piccolo prompt, ma dell'interpretazione dei tuoi comandi, specialmente se inserisci logiche complicate come pipe, condizionali e così via.

bash è la shell più comune utilizzata come shell predefinita per gli utenti di sistemi Linux . È un discendente spirituale di altre shell usate nella storia di Unix. Il suo nome, bash è un'abbreviazione di Bourne-Again Shell, un omaggio alla shell Bourne che è stato progettato per sostituire, sebbene incorpori anche funzioni dalla Shell C e dalla Shell di Korn.

È in corso, in questi giorni, da /bin/bash - qualsiasi sistema con bash lo renderà accessibile qui.

Non sono solo gli utenti che usano le shell, comunque. Gli script ( script di shell ) richiedono shell per interpretarli. Quando esegui uno script di shell, il tuo sistema deve avviare un processo di shell per eseguire lo script.

Il problema è che le diverse shell hanno piccole incoerenze tra loro e quando si tratta di eseguire script, questi possono essere un problema reale. bash ha un sacco di funzionalità di scripting che sono uniche solo per bash e non per altre shell. Questo va bene, se hai sempre intenzione di usare bash per eseguire quegli script. Altre shell possono provare ad emulare bash o ad aderire allo standard POSIX, che bash supporta piuttosto bene (sebbene aggiunga le proprie estensioni a).

È possibile specificare nella parte superiore di uno script di shell che shell deve essere eseguito utilizzando un shebang. Uno script può specificare #!/bin/bash sulla prima riga, il che significa che lo script deve sempre essere eseguito con bash, piuttosto che con un'altra shell.

/ bin / sh è un eseguibile che rappresenta la shell di sistema . In realtà, di solito viene implementato come collegamento simbolico che punta all'eseguibile per qualsiasi shell sia la shell di sistema. La shell di sistema è una specie di shell predefinita che gli script di sistema dovrebbero usare. Nelle distribuzioni Linux, per molto tempo questo era di solito un collegamento simbolico a bash , tanto che è diventato un po 'una convenzione per collegare sempre / bin / sh a bash o una shell compatibile bash . Tuttavia, negli ultimi due anni Debian (e Ubuntu) hanno deciso di cambiare la shell di sistema da bash a dash - una simile shell - rompendo con una lunga tradizione in Linux (beh, GNU) dell'uso di bash per / bin / sh. Dash è visto come una shell più leggera, e molto più veloce, che può essere utile per la velocità di avvio (e altre cose che richiedono molti script di shell, come gli script di installazione del pacchetto).

Dash è abbastanza ben compatibile con bash, essendo basato sullo stesso standard POSIX. Tuttavia, non implementa le estensioni bash-specifiche. Esistono degli script che usano #!/bin/sh (la shell di sistema) come loro shebang, ma che richiedono estensioni bash-specifiche. Questo è attualmente considerato un bug che dovrebbe essere corretto da Debian e Ubuntu, i quali richiedono / bin / sh di essere in grado di funzionare quando si punta al trattino.

Anche se la shell di sistema di Ubuntu punta a un trattino, la shell di login come utente continua a essere bash in questo momento. Cioè, quando si accede a un emulatore di terminale ovunque in Linux, la shell di accesso sarà bash. La velocità di funzionamento non è tanto un problema quando la shell viene utilizzata in modo interattivo, e gli utenti hanno familiarità con bash (e possono avere personalizzazioni bash specifiche nella loro home directory).

Che cosa dovresti usare quando scrivi script

Se il tuo script richiede funzionalità supportate solo da bash, usa #!/bin/bash .

Ma se possibile, sarebbe bene assicurarsi che lo script sia compatibile con POSIX e usare #!/bin/sh , che dovrebbe sempre, abbastanza affidabile, puntare alla shell di sistema compatibile con POSIX preferita in ogni installazione.

    
risposta data thomasrutter 25.05.2012 - 10:31
15

Oltre alle risposte precedenti, anche se /bin/sh è un collegamento simbolico a /bin/bash , #!/bin/sh non è totalmente equivalente a #!/bin/bash .

Dalla pagina man di bash (1) :

  

"Se bash è invocato con il nome sh, prova a simulare l'avvio   comportamento delle versioni storiche di sh il più vicino possibile, mentre   conforme allo standard POSIX. "

Ad esempio la sintassi bash specifica:

 exec  > >(tee logfile.txt)

dà un errore in una shell che inizia con #!/bin/sh , anche con il link simbolico bash sh- & gt; in posto.

    
risposta data AnkiF 14.01.2015 - 12:24

Leggi altre domande sui tag