Vraag Wat is het verschil tussen #! / Bin / sh en #! / Bin / bash?


als ik schrijf,

#!/bin/bash
echo "foo"

of

#!/bin/sh
echo "foo"

beide opbrengsten hetzelfde. Ik heb wat scripts gezien die beginnen met #!/bin/sh of #!/bin/bash. Is er een verschil tussen hen?


211
2018-05-25 03:59


oorsprong




antwoorden:


bash en sh zijn twee verschillende shells. Eigenlijk bash is sh, met meer functies en betere syntaxis. De meeste opdrachten werken hetzelfde, maar ze zijn anders.

Dat gezegd hebbende, moet je je realiseren /bin/sh op de meeste systemen zal een symbolische link zijn en zal niet worden aangeroepen sh. In Ubuntu /bin/sh gebruikt om naar te linken bash, typisch gedrag op Linux-distributies, maar nu is veranderd naar linken naar een andere schaal genaamd streepje. Ik zou gebruiken bash, want dat is min of meer de standaard (of op zijn minst de meest voorkomende, vanuit mijn ervaring). In feite doen zich problemen voor wanneer een bash-script wordt gebruikt #!/bin/sh omdat de script-maker ervan uitgaat dat de link naar is bash wanneer het niet hoeft te zijn.

Voor meer informatie, http://man.cx/sh, http://man.cx/bash.


178
2018-05-25 04:08



Je eerste alinea is nogal misleidend. "sh" is helemaal geen shell, maar een symbolische link naar de momenteel geconfigureerde systeemschil, die op Linux-systemen meestal bash of dash is (recente versies van Ubuntu die de laatste gebruikt). - thomasrutter
/bin/sh was vroeger een geroepen shell Bourne Shell terug in 1977. bash is een / bin / sh compatibele shell die kan worden gebruikt als vervanging voor een bourne-schaal die voldoet aan de posix-normen. en.wikipedia.org/wiki/Bourne_shell - Alex
bash is een de facto standaard (veel gebruikt) maar het is niet "standaard"; sh op Ubuntu gebruikt scheutje, wat een Posix-compliant shell is, dus het is echt standaard. Mijn advies is om te gebruiken scheutje zo vaak mogelijk voor scripting, vooral voor server-side scripts. Hoewel bashis expressiever, scheutje werkt vrij veel sneller en is veiliger. - Rick-777
@ Rick-777 Dus moet ik #! / Bin / dash expliciet boven aan mijn scripts plaatsen? Ik heb ook scripts geschreven waarbij ik alleen opdrachten schrijf en uitvoer met ./scriptName en dat werkt prima. Is de #! / Bin / yourShellHere noodzakelijk? - user137717
@ Rick-777 In de gevallen waarin ik #! / Bin / shellName uitsluit, heb ik de bestanden fileName.sh genoemd. Zal dat impliciet een link naar de geprefereerde systeemshell zonder #! / Bin / sh? - user137717


Op Linux en andere Unix-achtige systemen heb je de keuze uit meerdere shells.

De shell is niet alleen verantwoordelijk voor het tekenen van je kleine prompt, maar ook voor het interpreteren van je opdrachten, vooral als je gecompliceerde logica invoert zoals pijpen, conditionals enzovoort.

bash is de meest voorkomende shell die wordt gebruikt als standaardshell voor gebruikers van Linux-systemen. Het is een spirituele afstammeling van andere schelpen die in de Unix-geschiedenis worden gebruikt. Zijn naam, bash is een afkorting van Bourne-Again Shell, een eerbetoon aan de Bourne shell die het was ontworpen om te vervangen, hoewel het ook functies van de C Shell en de Korn Shell bevat.

Het wordt gerund, tegenwoordig /bin/bash - elk systeem met bash zal het hier toegankelijk hebben.

Het zijn echter niet alleen gebruikers die shells gebruiken. Scripts (shellscripts) hebben shells nodig om ze te interpreteren. Wanneer u een shell-script uitvoert, moet uw systeem een ​​shell-proces starten om uw script uit te voeren.

Het probleem is dat verschillende shells kleine inconsistenties tussen beide hebben en als het gaat om het uitvoeren van scripts, kunnen deze problemen een groot probleem zijn. bash heeft nogal wat scripting-functies die alleen voor bash uniek zijn, en niet voor andere shells. Dit is prima, als je altijd bash gaat gebruiken om die scripts uit te voeren. Andere shells kunnen proberen bash te emuleren, of zich te houden aan de POSIX-standaard, die bash vrij goed ondersteunt (hoewel zijn eigen extensies aan toevoegt).

Het is mogelijk om aan de bovenkant van een shellscript aan te geven met welke shell het moet worden uitgevoerd met behulp van een shebang. Een script kan specificeren #!/bin/bash op de eerste regel, wat betekent dat het script altijd met bash moet worden uitgevoerd, in plaats van een andere shell.

/ Bin / sh is een uitvoerbaar bestand dat de systeemschil. In feite wordt het meestal geïmplementeerd als een symbolische link die naar het uitvoerbare bestand verwijst voor elke shell die de systeemshell is. De systeemshell is een soort van de standaardshell die systeemscripts moeten gebruiken. In Linux-distributies was dit lange tijd meestal een symbolische link naar bashzozeer zelfs dat het enigszins een conventie is geworden om altijd / bin / sh te verbinden met bash of een bash-compatibele shell. De laatste paar jaar besloot Debian (en Ubuntu) echter om de systeemshell van bash in te schakelen scheutje - een vergelijkbare shell - brekend met een lange traditie in Linux (nou ja, GNU) van bash gebruiken voor / bin / sh. Dash wordt gezien als een lichtere en veel snellere shell die nuttig kan zijn voor de opstartsnelheid (en andere dingen die veel shell-scripts vereisen, zoals scripts voor pakketinstallatie).

Dash is redelijk goed compatibel met bash, op basis van dezelfde POSIX-standaard. Het implementeert echter de bash-specifieke uitbreidingen niet. Er zijn scripts in gebruik die gebruiken #!/bin/sh (de systeemshell) als hun shebang, maar die bash-specifieke uitbreidingen vereisen. Dit wordt momenteel beschouwd als een bug die moet worden opgelost door Debian en Ubuntu, die / bin / sh nodig hebben om te kunnen werken wanneer ze op dash worden gewezen.

Ook al is het Ubuntu's systeemschil wijst naar streepje, jouw login shell als een gebruiker blijft bash op dit moment. Dat wil zeggen dat wanneer je je bij een terminalemulator ergens in Linux aanmeldt, je inlogshell bash is. Snelheid van de werking is niet zo zeer een probleem wanneer de shell interactief wordt gebruikt, en gebruikers bekend zijn met bash (en mogelijk bash-specifieke aanpassingen hebben in hun homedirectory).

Wat u moet gebruiken bij het schrijven van scripts

Als uw script functies vereist die alleen door bash worden ondersteund, gebruikt u #!/bin/bash.

Maar als het enigszins mogelijk is, zou het goed zijn om ervoor te zorgen dat uw script POSIX-compatibel is en gebruikt #!/bin/sh, die altijd betrouwbaar moet verwijzen naar de POSIX-compatibele systeemshell in elke installatie.


62
2018-05-25 08:31





Naast de vorige antwoorden, zelfs als /bin/sh is een symbolische link naar /bin/bash, #!/bin/sh is niet helemaal gelijk aan #!/bin/bash.

Van de bash (1) man pagina :

"Als bash wordt aangeroepen met de naam sh, probeert het de startup na te bootsen   gedrag van historische versies van sh zo dicht mogelijk, terwijl   conform ook aan de POSIX-standaard. "

Bijvoorbeeld de bash-specifieke syntaxis:

 exec  > >(tee logfile.txt)

geeft een fout in een shell die begint met #!/bin/sh, zelfs met de sh-> bash symbolische link op zijn plaats.


15
2018-01-14 11:24