Is er een bash
kreng 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 bash
gebruiken voor draagbaarheid: verschillende *nixen plaatsen bash
op verschillende plaatsen en gebruiken /usr/bin/env
is een tijdelijke oplossing om de eerste bash
uit te voeren die op het PATH
wordt gevonden. En sh
is geen bash
.
Antwoord 2, autoriteit 6%
Ik raad aan om:
#!/bin/bash
Het is niet 100% draagbaar (sommige systemen plaatsen bash
op een andere locatie dan /bin
), maar het feit dat veel bestaande scripts #!/bin/bash
zet verschillende besturingssystemen onder druk om /bin/bash
op 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 env
in /usr/bin
staat (en ik heb systemen gebruikt waar dat niet het geval is). Bovendien gebruikt dit formulier de eerste instantie van bash
in de huidige gebruikers $PATH
, wat mogelijk geen geschikte versie van de bash-shell is.
(Maar /usr/bin/env
zou op elk redelijk modern systeem moeten werken, ofwel omdat env
in /usr/bin
staat, 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/bash
heeft, 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
(bash
is /data/data/com.termux/files/usr/bin/bash
) — maar het heeft een speciale behandeling om #!/bin/bash
te ondersteunen.
Antwoord 3, autoriteit 5%
/bin/sh
is meestal een link naar de standaard shell van het systeem, die vaak bash
is, 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
, bash
tot 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 env
maakt 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 man
pagina’s voor bash
:
man bash
en env
:
man env
Opmerking: op Debian en op Debian gebaseerde systemen, zoals Ubuntu, is sh
gekoppeld aan dash
en niet aan bash
. Zoals alle systeemscripts sh
gebruiken. 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/sh
is 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.