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


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?


211
2018-05-25 03:59


origine




risposte:


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 usato per collegarsi a bash, comportamento tipico sulle distribuzioni Linux, ma ora è cambiato in collegamento a un'altra shell chiamata dash. io userei bash, come quello è praticamente lo standard (o almeno il più comune, dalla mia esperienza). In realtà, i problemi sorgono quando si userà uno script bash #!/bin/sh perché lo script-maker presume che il link sia bash quando non deve essere.

Per maggiori informazioni, http://man.cx/sh, http://man.cx/bash.


178
2018-05-25 04:08



Il tuo primo paragrafo è abbastanza fuorviante. "sh" non è affatto una shell, ma un collegamento simbolico con la configurazione attualmente configurata shell di sistema, che su sistemi Linux è solitamente o bash o dash (versioni recenti di Ubuntu che utilizzano quest'ultimo). - thomasrutter
/bin/sh era una shell chiamata bourne shell nel 1977. bash è una shell compatibile con / bin / sh può essere usato come una sostituzione di shell bourne che è conforme alla posix. en.wikipedia.org/wiki/Bourne_shell - Alex
bash è uno standard di fatto (molto usato) ma non è "standard"; sh su Ubuntu utilizza trattino, che è una shell compatibile con Posix, quindi è davvero standard. Il mio consiglio è di usare trattino il più spesso possibile per lo scripting, specialmente per gli script sul lato server. Sebbene bashè più espressivo, trattino corre molto più veloce ed è più sicuro. - Rick-777
@ Rick-777 Quindi dovrei inserire esplicitamente #! / Bin / dash nella parte superiore dei miei script? Ho anche scritto script in cui scrivo solo comandi ed eseguo con ./scriptName e che ha funzionato bene. È necessario il #! / Bin / yourShell? - user137717
@ Rick-777 Nei casi in cui escludo qualsiasi #! / Bin / shellName, ho chiamato i file fileName.sh. Sarà implicitamente collegato alla shell di sistema preferita senza dichiarare #! / Bin / sh? - user137717


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

La shell è responsabile non solo del disegno del piccolo prompt, ma dell'interpretazione dei comandi, soprattutto se si inseriscono 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 Korn.

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

Tuttavia, non sono solo gli utenti che usano le shell. Script (script di shell) hanno bisogno di shell per interpretarle. Quando si esegue uno script di shell, il 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 a 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 dovrebbe sempre essere eseguito con bash, piuttosto che con un'altra shell.

/ Bin / sh è un eseguibile che rappresenta il 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 lungo 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 bash-compatibile. Tuttavia, negli ultimi due anni Debian (e Ubuntu) hanno deciso di cambiare la shell di sistema da bash a trattino - una shell simile - 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, che richiedono / bin / sh di essere in grado di lavorare quando puntano a un trattino.

Anche se di Ubuntu shell di sistema sta indicando un trattino, il tuo 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).

Cosa dovresti usare quando scrivi degli 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 usarlo #!/bin/sh, che dovrebbe sempre, abbastanza attendibilmente, puntare alla shell di sistema compatibile POSIX preferita in ogni installazione.


62
2018-05-25 08:31





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

Dal 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 pure. "

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 sh-> bash in atto.


15
2018-01-14 11:24