Was bedeutet die Zeile "#! / Bin / sh" in einem UNIX-Shell-Skript?

142

Ich habe einige Shell-Skript-Tutorials durchgesehen und das folgende Beispielprogramm gefunden:

#!/bin/sh
clear
echo "HELLO WORLD"

Kann mir bitte jemand sagen, welche Bedeutung der Kommentar #!/bin/shzu Beginn hat?

Jake
quelle

Antworten:

143

Es heißt Shebang und teilt der übergeordneten Shell mit, welcher Interpreter zum Ausführen des Skripts verwendet werden soll.

z.B

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

Es wird als Kommentar implementiert, sodass alles, was in diese Zeile kommt, für den angegebenen Interpreter nicht "relevant" ist. Beispielsweise neigen alle Skriptsprachen dazu zu verstehen, dass eine Zeile, die mit beginnt, #ein Kommentar ist, und ignorieren den !/usr/bin/whateverTeil, der andernfalls ein Syntaxfehler in dieser bestimmten Sprache sein könnte.

Marc B.
quelle
6
Es ist normalerweise der Kernel, nicht die Shell, die dies verarbeitet. Die Shell ruft einfach den exec()Systemaufruf für die Datei auf.
Tripleee
47

Wenn Sie versuchen, ein Programm unter Unix auszuführen (eines mit gesetztem ausführbaren Bit), überprüft das Betriebssystem die ersten Bytes der Datei. Diese bilden die sogenannte "magische Zahl", anhand derer das Format des Programms und seine Ausführung festgelegt werden können.

#!entspricht der magischen Zahl 0x2321 (in einer ASCII-Tabelle nachschlagen). Wenn das System die magische Zahl erkennt, weiß es, dass es sich um ein Textskript handelt, und liest bis zum nächsten \n(es gibt eine Grenze, aber es entgeht mir atm). Nachdem der Interpreter identifiziert wurde (das erste Argument nach dem Schebang), wird der Interpreter aufgerufen.

Andere Dateien haben ebenfalls magische Zahlen. Wenn Sie eine Bitmap-Datei (.BMP) über anzeigen less, werden die ersten beiden Zeichen angezeigt BM. Diese magische Zahl zeigt an, dass die Datei tatsächlich eine Bitmap ist.

Foo Bah
quelle
10

Wenn die Datei, in der sich dieses Skript befindet, ausführbar ist, #!teilt hash-bang ( ) dem Betriebssystem mit, welcher Interpreter zum Ausführen des Skripts verwendet werden soll. In diesem Fall ist es /bin/shzum Beispiel.

Es gibt einen Wikipedia-Artikel darüber für weitere Informationen.

Kusalananda
quelle
5

Die erste Zeile teilt der Shell mit, dass sie das Programm (in diesem Fall / bin / sh) zur Interpretation verwenden sollte, wenn Sie das Skript direkt ausführen (./run.sh; im Gegensatz zu / bin / sh run.sh).

Sie können es auch verwenden, um Argumente zu übergeben, üblicherweise -e (bei Fehler beenden) oder andere Programme (/ bin / awk, / usr / bin / perl usw.) zu verwenden.

Kevin
quelle
-4

#!/bin/shoder #!/bin/bashmuss die erste Zeile des Skripts sein, denn wenn Sie es nicht in der ersten Zeile verwenden, behandelt das System alle Befehle in diesem Skript als unterschiedliche Befehle. Wenn die erste Zeile steht #!/bin/sh, werden alle Befehle als ein einziges Skript betrachtet und es wird angezeigt, dass diese Datei im psBefehl ausgeführt wird und nicht die Befehle in der Datei.

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo
Sarvesh Pawar
quelle
1
Stapelüberlauf ist nicht Twitter. Bitte nehmen Sie sich die Zeit, um Wörter wie "u" und "1st" zu buchstabieren. Sie helfen beim Schreiben eines Nachschlagewerks, sodass die richtige Grammatik und Rechtschreibung von Bedeutung sind. Achten Sie auch auf die richtige Formatierung. Befehle, die über die Befehlszeile ausgegeben werden ps, und Code-Auszüge wie #!/bin/shsollten formatiert werden.
der Blechmann
Ich habe versucht, die Engländer hier aufzuräumen, bin mir aber immer noch nicht sicher, was das bedeutet. Ich denke, die Antwort versucht zu sagen, dass Befehle im Skript als unterschiedliche Befehle ausgeführt werden und das Hinzufügen eines Shebang das Skript als einen einzelnen Befehl in einer Prozessliste anzeigt. Das ist eigentlich nicht wahr.
Tripleee