30Jul

Wanneer is het beter # te gebruiken! /bin/ bash In plaats van #!/bin/ sh in een shellscript?

Wanneer u een nieuw shellscript maakt, wilt u ervoor zorgen dat het zo probleemloos mogelijk is, maar soms kan het een beetje verwarrend zijn om te weten welke shebang de beste is die u kunt gebruiken. In dat opzicht heeft de SuperUser Q & A-post van vandaag het antwoord op de vraag van een verwarde lezer.

De vraag van vandaag &Antwoord sessie komt naar ons met dank aan SuperUser-een onderverdeling van Stack Exchange, een community-gestuurde groepering van Q & A-websites.

De vraag

SuperUser-lezer Hendre wil weten wanneer het beter is om # te gebruiken! /bin/ bash in plaats van #!/bin/ sh in shellscripts:

Wanneer is het passender om # te gebruiken! /bin/ bash in plaats van #!/bin/ sh in een shellscript?

Wanneer is het beter om # te gebruiken! /bin/ bash in plaats van #!/bin/ sh in een shellscript?

Het antwoord

SuperUser contributor grawity heeft het antwoord voor ons:

Samengevat:

  • Er zijn verschillende shells die een superset van de POSIX sh-specificatie implementeren. Op verschillende systemen kan /bin/ sh een link zijn naar ash, bash, dash, ksh, zsh, etc. Het zal echter altijd sh-compatibel zijn, nooit csh of fish.
  • Zolang u zich alleen aan sh-functies houdt, kunt u #( en waarschijnlijk zelfs gebruiken)!/bin/ sh en het script zou goed moeten werken, ongeacht welke shell het is.
  • Als u bash-specifieke functies( dat wil zeggen arrays) gaat gebruiken, moet u specifiek bash aanvragen omdat, zelfs als /bin/ sh al bash op uw systeem aanroept, dit misschien niet op het systeem van iedereen staat en uw script zal daar niet worden uitgevoerd. Hetzelfde geldt natuurlijk voor zsh en ksh.
  • Zelfs als het script alleen voor persoonlijk gebruik is, merkt u mogelijk dat sommige besturingssystemen /bin/ sh tijdens upgrades wijzigen. Bijvoorbeeld, op Debian was het bash, maar werd later vervangen door het zeer minimale streepje. Scripts die bashismen gebruikten maar # hadden! /bin/ sh is plotseling gebroken.

Echter:

  • Zelfs #!/bin/ bash klopt niet. Op verschillende systemen kan bash voorkomen in /usr/-bak , /usr/pkg/-bak of /usr/local/-bak .
  • Een meer betrouwbare optie is #!/usr/bin/ env bash , die $ PATH gebruikt. Hoewel de env-tool zelf ook niet strikt is gegarandeerd, werkt /usr/bin/ env nog steeds op meer systemen dan /bin/ bash .

Heeft u iets toe te voegen aan de uitleg? Geluid uit in de reacties. Wilt u meer antwoorden van andere technisch onderlegde Stack Exchange-gebruikers lezen? Bekijk de volledige discussiethread hier.

beeldcredits: Wikipedia