Waarom moet je #!/bin/bash aan het begin van een scriptbestand zetten?

Ik heb eerder Bash-scripts gemaakt en ze werkten allemaal prima zonder #!/bin/bashaan het begin.

Wat heeft het voor zin om het in te voeren? Zouden de dingen anders zijn?

Hoe spreek je ook #uit? Ik weet dat !wordt uitgesproken als “bang”.

Hoe wordt #!uitgesproken?


Antwoord 1, autoriteit 100%

Het is een conventie, dus de *nix-shell weet wat voor soort interpreter moet worden uitgevoerd.

Bijvoorbeeld, oudere versies van ATT gebruikten standaard sh(de Bourne-shell), terwijl oudere versies van BSD standaard csh(de C-shell) gebruikten.

Zelfs vandaag (waar de meeste systemen bash draaien, de “Bourne Again Shell”), kunnen scripts in bash, python, perl, ruby, PHP, etc, etc. zie #!/bin/perlof #!/bin/perl5.

PS:
Het uitroepteken (!) wordt liefkozend “bang”genoemd. Het shell-commentaarsymbool (#) wordt soms “hash”genoemd.

PPS:
Onthoud – onder *nix is ​​het associëren van een achtervoegsel aan een bestandstype slechts een conventie, geen “regel”. Een uitvoerbaarkan een binair programma zijn, elk van een miljoen scripttypes en ook andere dingen. Vandaar de noodzaak voor #!/bin/bash.


Antwoord 2, autoriteit 31%

Om preciezer te zijn: de shebang#!, wanneer het de eerste twee bytes zijn van een uitvoerbaar bestand(xmode) bestand, wordt geïnterpreteerd door de execve(2) systeemaanroep (die programma’s uitvoeren). Maar de POSIX-specificatie voor execveniet noem de kreng.

Het moet worden gevolgd door een bestandspad van een uitvoerbaar bestand van een interpreter (wat zelfs relatief kan zijn, maar meestal absoluut is).

Een leuke truc (of misschien niet zo leuke) om een ​​tolk te vinden (bijv. python) in het $PATHvan de gebruiker is om het programma envte gebruiken (altijd op /usr/bin/envop alle Linux-systemen) zoals bijv.

#!/usr/bin/env python

Elk ELF-uitvoerbaar bestand kan een tolk zijn. Je zou zelfs #!/bin/catof #!/bin/truekunnen gebruiken als je dat zou willen! (maar dat zou vaak nutteloos zijn)


Antwoord 3, autoriteit 11%

Het wordt een shebanggenoemd. In unix-taal heet # scherp (zoals in muziek) of hash (zoals hashtags op twitter), en ! wordt knal genoemd. (Je kunt naar je vorige shell-opdracht verwijzen met !!, genaamd bang-bang). Dus als je het samenvoegt, krijg je haSH-BANG of shebang.

Het gedeelte na de #! vertelt Unix welk programma het moet gebruiken. Als het niet gespecificeerd is, zal het proberen met bash (of sh, of zsh, of wat je $SHELL-variabele ook is) maar als het daar is, zal het dat programma gebruiken. Bovendien is # een opmerking in de meeste talen, dus de regel wordt genegeerd bij de daaropvolgende uitvoering.


Antwoord 4, autoriteit 4%

Het besturingssysteem gebruikt de standaardshell om uw shellscript uit te voeren. dus als je het shell-pad aan het begin van het script vermeldt, vraag je het besturingssysteem om die specifieke shell te gebruiken. Het is ook nuttig voor draagbaarheid.


Antwoord 5, autoriteit 4%

De shebangis een instructie aan de lader om het programma te gebruiken dat is gespecificeerd na de #!als de interpreter voor het bestand in kwestie wanneer u het probeert uit te voeren. Dus als je een bestand probeert uit te voeren met de naam foo.shdat #!/bin/bashbovenaan heeft, is het eigenlijke commando dat wordt uitgevoerd /bin/bash foo.sh. Dit is een flexibele manier om verschillende tolken voor verschillende programma’s te gebruiken. Dit is iets geïmplementeerd op systeemniveau en de API op gebruikersniveau is de shebang-conventie.

Het is ook de moeite waard om te weten dat de kreng een magisch getalis – een door mensen leesbaar getal dat de bestand als een script voor de gegeven interpreter.

Uw punt dat het “werkt”, zelfs zonder de shebang, is alleen omdat het programma in kwestie een shellscript is dat is geschreven voor dezelfde shell als degene die u gebruikt. U kunt bijvoorbeeld heel goed een javascript-bestand schrijven en dan een #! /usr/bin/js(of iets dergelijks) om een ​​javascript “Shell-script” te hebben.


Antwoord 6, autoriteit 4%

Elke distributie heeft een standaard shell. Bash is de standaard op de meeste systemen. Als je toevallig op een systeem werkt dat een andere standaardshell heeft, werken de scripts mogelijk niet zoals bedoeld als ze specifiek voor Bash zijn geschreven.

Bash is in de loop der jaren geëvolueerd door code van kshen shte gebruiken.

Het toevoegen van #!/bin/bashals de eerste regel van je script, vertelt het besturingssysteem om de gespecificeerde shellaan te roepen om de commando’s die volgen in het script uit te voeren.

#!wordt vaak een “hash-bang”, “she-bang” of “sha-bang” genoemd.


Antwoord 7, autoriteit 2%

Het wordt een shebanggenoemd. Het bestaat uit een hekje en een uitroepteken (#!), gevolgd door het volledige pad naar de interpreter, zoals /bin/bash. Alle scripts onder UNIX en Linux worden uitgevoerd met behulp van de interpreter die op een eerste regel is opgegeven.


Antwoord 8

Bash-standaarden voor ‘Bourne-Again shell’ is slechts een van de vele beschikbare
shells in Linux.

Een shell is een opdrachtregelinterpreter die opdrachten accepteert en uitvoert.

Bash is vaak de standaardshell in de meeste Linux-distributies. Dit is waarom bash is
synoniem voor shell.

De shellscripts hebben vaak bijna dezelfde syntaxis, maar ze verschillen soms ook. De array-index begint bijvoorbeeld bij 1 in Zsh in plaats van 0 in bash. Een script
geschreven voor Zsh-shell werkt niet hetzelfde in bash als het arrays heeft.

Om onaangename verrassingen te voorkomen, moet u de tolk vertellen dat uw shellscript
is geschreven voor bash-shell. Hoe doe je dat?

begin gewoon je bash-script in #!/bin/bash


Antwoord 9

Je zult ook enkele andere parameters zien na #!/bin/bash,
bijvoorbeeld
#!/bin/bash -v -x
lees dit om meer idee te krijgen.
https://unix.stackexchange.com/ vragen/124272/wat-doen-de-argumenten-v-and-x-mean-to-bash.


Antwoord 10

Het kan handig zijn voor iemand die een ander systeem gebruikt dat die bibliotheek niet direct beschikbaar heeft. Als dat niet is gedeclareerd en je hebt enkele functies in je script die niet door dat systeem worden ondersteund, moet je #/bin/bash declareren. Ik ben dit probleem eerder tegengekomen op het werk en nu neem ik het gewoon op als een oefening.

Other episodes