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

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 commando ‘ s, vooral als je ingewikkelde logica invoert zoals pipes, conditionals enzovoort.

bash is de meest voorkomende shell die gebruikt wordt als standaard shell voor gebruikers van Linux systemen. Het is een spirituele afstammeling van andere schelpen gebruikt door de geschiedenis van Unix. De naam bash is een afkorting van Bourne-Again Shell, een hommage aan de Bourne shell die het moest vervangen, hoewel het ook functies van de C Shell en de Korn Shell bevat.

het wordt tegenwoordig uitgevoerd vanaf /bin/bash – elk systeem met bash zal het hier toegankelijk hebben.

het zijn echter niet alleen gebruikers die shells gebruiken. Scripts (shell scripts) hebben shells nodig om ze te interpreteren. Wanneer je een shell script draait, moet je systeem een shell proces opstarten om je script uit te voeren.

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

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

/ bin / sh is een uitvoerbaar bestand dat de systeemshell vertegenwoordigt. Eigenlijk wordt het meestal geà mplementeerd als een symbolische link die naar het uitvoerbare verwijst voor welke shell ook de systeemshell is. De systeem shell is een soort van de standaard shell die systeem scripts zouden moeten gebruiken. In Linux distributies was dit lange tijd meestal een symbolische link naar bash, zozeer zelfs dat het een soort conventie is geworden om altijd /bin/sh te koppelen aan bash of een bash-compatibele shell. Echter, in de laatste paar jaar Debian (en Ubuntu) besloten om de systeem shell te schakelen van bash naar dash – een soortgelijke shell – breken met een lange traditie in Linux (goed, GNU) van het gebruik van bash voor /bin/sh. Dash wordt gezien als een lichtere, en veel snellere, shell die nuttig kan zijn om snelheid op te starten (en andere dingen die veel shell scripts vereisen, zoals pakket installatie scripts).

Dash is vrij goed compatibel met bash, gebaseerd op dezelfde POSIX-standaard. Het implementeert echter niet de bash-specifieke extensies. Er bestaan scripts die #!/bin/sh (de systeemshell) als hun shebang gebruiken, maar die bash-specifieke extensies vereisen. Dit wordt momenteel beschouwd als een bug die moet worden opgelost door Debian en Ubuntu, die vereisen /bin/sh om te kunnen werken wanneer wees naar dash.

hoewel Ubuntu ‘ s systeem shell verwijst naar dash, blijft uw login shell als gebruiker bash op dit moment. Dat wil zeggen, wanneer je inlogt op een terminal emulator waar dan ook in Linux, zal je login shell bash zijn. De snelheid van de werking is niet zozeer een probleem wanneer de shell interactief wordt gebruikt, en gebruikers bekend zijn met bash (en kunnen bash-specifieke aanpassingen hebben in hun home directory).

wat moet u gebruiken bij het schrijven van scripts

als uw script functies vereist die alleen ondersteund worden door bash, gebruik dan #!/bin/bash.

maar als het al mogelijk is, zou het goed zijn om er zeker van te zijn dat je script POSIX-compatibel is, en gebruik #!/bin/sh, wat altijd, vrij betrouwbaar, naar de gewenste POSIX-compatibele systeem shell in elke installatie moet wijzen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.