Wat is de favoriete Bash shebang?

Is er een bashkreng die objectief beter is dan de andere voor de meeste toepassingen?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • enz.

Ik herinner me vaag lang geleden dat ik hoorde dat het toevoegen van een streepje aan het einde iemand verhindert een commando aan je script door te geven, maar kan daar geen details over vinden.


Antwoord 1, autoriteit 100%

U moet #!/usr/bin/env bashgebruiken voor draagbaarheid: verschillende *nixen plaatsen bashop verschillende plaatsen en gebruiken /usr/bin/envis een tijdelijke oplossing om de eerste bashuit te voeren die op het PATHwordt gevonden. En shis geen bash.


Antwoord 2, autoriteit 6%

Ik raad aan om:

#!/bin/bash

Het is niet 100% draagbaar (sommige systemen plaatsen bashop een andere locatie dan /bin), maar het feit dat veel bestaande scripts #!/bin/bashzet verschillende besturingssystemen onder druk om /bin/bashop zijn minst een symbolische link naar de hoofdlocatie te maken.

Het alternatief van:

#!/usr/bin/env bash

is gesuggereerd — maar er is geen garantie dat de opdracht envin /usr/binstaat (en ik heb systemen gebruikt waar dat niet het geval is). Bovendien gebruikt dit formulier de eerste instantie van bashin de huidige gebruikers $PATH, wat mogelijk geen geschikte versie van de bash-shell is.

(Maar /usr/bin/envzou op elk redelijk modern systeem moeten werken, ofwel omdat envin /usr/binstaat, of omdat het systeem iets doet om het te laten werken. Het systeem waarnaar ik hierboven verwees was SunOS 4, dat ik waarschijnlijk al 25 jaar niet meer heb gebruikt.)

Als je een script nodig hebt om te draaien op een systeem dat geen /bin/bashheeft, kun je het script zo aanpassen dat het naar de juiste locatie verwijst (dat is weliswaar onhandig).

Ik heb de afwegingen uitgebreider besproken in mijn antwoordop deze vraag.

Een ietwat obscure update: één systeem dat ik gebruik, Termux, een desktop-Linux-achtige laag die onder Android draait , heeft geen /bin/bash(bashis /data/data/com.termux/files/usr/bin/bash) — maar het heeft een speciale behandeling om #!/bin/bashte ondersteunen.


Antwoord 3, autoriteit 5%

/bin/shis meestal een link naar de standaard shell van het systeem, die vaak bashis, maar op bijv. Debian-systemen is het lichtere dash. Hoe dan ook, de originele Bourne-shell is sh, dus als je script wat bash(2e generatie, “Bourne Again sh”) gebruikt, specifieke functies ([[ ]]tests, arrays, verschillende zoete dingen, enz.), dan moet u specifieker zijn en de laatste gebruiken. Op deze manier wordt je script niet uitgevoerd op systemen waarop bash niet is geïnstalleerd. Ik begrijp dat er misschien een spannende trilogie van films over deze evolutie komt… maar dat kan van horen zeggen zijn.

Houd er rekening mee dat wanneer opgeroepen als sh, bashtot op zekere hoogte gedraagt zich als POSIX-standaardsh(zie ook de GNU-documentenhierover).


Antwoord 4, autoriteit 2%

Het gebruik van een shebang-regel om de juiste interpreter aan te roepen is niet alleen voor BASH. U kunt de shebang gebruiken voor elke geïnterpreteerde taal op uw systeem, zoals Perl, Python, PHP (CLI) en vele andere. Trouwens, de kreng

#!/bin/sh -

(het kunnen ook twee streepjes zijn, d.w.z. --) beëindigt bash-opties, alles daarna wordt behandeld als bestandsnamen en argumenten.

Het gebruik van de opdracht envmaakt uw script draagbaar en stelt u in staat om aangepaste omgevingen voor uw script in te stellen, daarom zouden draagbare scripts

moeten gebruiken

#!/usr/bin/env bash

Of voor welke taal dan ook, zoals voor Perl

#!/usr/bin/env perl

Bekijk de manpagina’s voor bash:

man bash

en env:

man env

Opmerking: op Debian en op Debian gebaseerde systemen, zoals Ubuntu, is shgekoppeld aan dashen niet aan bash. Zoals alle systeemscripts shgebruiken. Hierdoor kan bash groeien en blijft het systeem stabiel, volgens Debian.

Ook om het aanroepen van *nix te behouden, zoals ik nooit bestandsextensies gebruik op door shebang aangeroepen scripts, omdat je de extensie bij het aanroepen van uitvoerbare bestanden niet kunt weglaten zoals je kunt op Windows. Het bestandscommando kan het identificeren als een script.


Antwoord 5

Het hangt er echt van af hoe je je bash-scripts schrijft. Als uw /bin/shis gekoppeld aan bash, wanneer bash wordt aangeroepen als sh, sommige functies zijn niet beschikbaar.

Als je bash-specifieke, niet-POSIX-functies wilt, gebruik dan #!/bin/bash


Antwoord 6

#!/bin/sh

omdat de meeste scripts geen specifieke bash-functie nodig hebben en voor sh moeten worden geschreven.

Dit zorgt er ook voor dat scripts werken op de BSD’s, die standaard geen bash hebben.

Other episodes