679 Stimmen

Warum müssen Sie #!/bin/bash an den Anfang einer Skriptdatei setzen?

Ich habe Bash Skripte, und sie liefen alle problemlos ohne #!/bin/bash am Anfang.

Wozu soll man das einbauen? Würden die Dinge anders laufen?

Außerdem, wie spricht man aus # ? Ich weiß, dass ! wird als "bang" ausgesprochen.

Wie ist #! ausgeprägt?

555voto

paulsm4 Punkte 106654

Es ist eine Konvention, damit die *nix-Shell weiß, welche Art von Interpreter sie ausführen soll.

Ältere Versionen von ATT zum Beispiel waren standardmäßig auf sh (die Bourne-Shell), während ältere BSD-Versionen standardmäßig auf csh (die C-Shell).

Sogar heute (wo die meisten Systeme mit der Bash laufen, ist die "Bourne Again Shell" ), Skripte können in Bash, Python, Perl, Ruby, PHP usw. geschrieben sein. Zum Beispiel könnten Sie sehen #!/bin/perl ou #!/bin/perl5 .

PS: Das Ausrufezeichen ( ! ) wird liebevoll genannt "Peng" . Das Shell-Kommentar-Symbol ( # ) wird manchmal als "Raute" .

PPS: Denken Sie daran - unter *nix ist das Zuordnen eines Suffixes zu einem Dateityp lediglich eine Tagung , nicht ein "Regel" . Eine ausführbar kann ein binäres Programm, eines von einer Million Skripttypen und auch andere Dinge sein. Daher die Notwendigkeit für #!/bin/bash .

164voto

Um genauer zu sein, die . #! wenn es sich um die ersten beiden Bytes eines ausführbar ( x Modus ), wird von der Datei execve(2) Systemaufrufe (die Programme ausführen). Aber POSIX-Spezifikation für execve erwähnen Sie den ganzen Kram nicht.

Es muss ein Dateipfad zu einer ausführbaren Interpreterdatei folgen (der übrigens auch relativ sein kann, aber meistens absolut ist).

Ein netter Trick (oder vielleicht nicht so schön einen), um einen Dolmetscher zu finden (z. B. python ) in der Benutzeroberfläche $PATH ist die Verwendung der env Programm (immer bei /usr/bin/env auf allen Linux-Systemen) wie z. B.

 #!/usr/bin/env python

Jede ausführbare ELF-Datei kann ein Interpreter sein. Sie können sogar #!/bin/cat ou #!/bin/true wenn Sie das wollten! (aber das wäre oft nutzlos)

59voto

austin1howard Punkte 4745

Man nennt es einen . . In der Unix-Sprache heißt # sharp (wie in der Musik) oder hash (wie Hashtags bei Twitter), und ! heißt bang. (Sie können sogar auf Ihren vorherigen Shell-Befehl mit !! verweisen, was bang-bang genannt wird). Zusammen ergibt das haSH-BANG, oder shebang.

Der Teil nach dem #! sagt Unix, mit welchem Programm es ausgeführt werden soll. Wenn es nicht angegeben ist, wird es mit bash (oder sh, oder zsh, oder was auch immer Ihre $SHELL-Variable ist) versucht, aber wenn es da ist, wird es dieses Programm verwenden. Außerdem ist # in den meisten Sprachen ein Kommentar, so dass die Zeile bei der nachfolgenden Ausführung ignoriert wird.

23voto

jaypal singh Punkte 70917

Jede Distribution hat eine Standard-Shell. Auf den meisten Systemen ist die Bash die Standard-Shell. Wenn Sie auf einem System arbeiten, das eine andere Standardshell hat, funktionieren die Skripte möglicherweise nicht wie vorgesehen, wenn sie speziell für Bash geschrieben wurden.

Die Bash hat sich im Laufe der Jahre weiterentwickelt, indem sie Code aus ksh y sh .

Hinzufügen von #!/bin/bash als erste Zeile Ihres Skripts, weist das Betriebssystem an, die angegebene shell um die Befehle auszuführen, die im Skript folgen.

#! wird oft als "Raute-Knall", "Sie-Knall" oder "Sha-Knall" bezeichnet.

20voto

Balaswamy Vaddeman Punkte 7970

Das Betriebssystem nimmt die Standard-Shell, um Ihr Shell-Skript auszuführen. Wenn Sie also den Shell-Pfad am Anfang des Skripts angeben, bitten Sie das Betriebssystem, diese bestimmte Shell zu verwenden. Es ist auch nützlich für Tragbarkeit .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X