Warum beginnt die "She-Bang" mit einem #!
, wie #!/bin/bash
? Ich habe immer akzeptiert, dass dies so gemacht wird, aber gibt es einen Grund dafür?
Warum anfangen mit #
; Ist das nicht normalerweise ein Kommentar? Oder ist es der Punkt, dass es ein Kommentar sein sollte?
#!
(so viel sich dmr erinnert…), einschließlich einer Erklärung, warum die#
(ja, die Linie musste von vorhandenen Muscheln ignoriert werden).Antworten:
Typischerweise bezieht sich shebang nur auf das
#!
(!
wird normalerweise "bang" genannt, und es sieht so aus, als ob "she" eine Verfälschung von "SHArp" oder "haSH" ist#
) - die gesamte Linie wird shebang-Linie genanntEs beginnt absichtlich mit einem Kommentarzeichen, um die Abwärtskompatibilität mit Dingen zu gewährleisten, die nicht wissen, wie sie damit umgehen sollen. Das
!
ist vermutlich nur, um es von einem zufälligen Kommentar zu unterscheiden, der die Datei startet, sodass eine Datei, die mit beginnt,# this is my script!
nicht versucht, denthis is my script!
Interpreter auszuführenquelle
!
wird häufig in anderen Kontexten verwendet, um einen auszuführenden Befehl anzugeben. Zum Beispiel invim
oder anderen Programmen mit eigenen Befehlszeilen ist Bang oft das Escape-Zeichen, mit dem sie den Befehl in einer System-Shell anstelle ihrer internen Schnittstelle ausführen.Um dies zu verstehen, müssen Sie erkennen, dass die erste Zeile des Skripts tatsächlich zweimal von zwei verschiedenen Programmen gelesen wird . Beim ersten Mal öffnet der Kernel die Datei und sucht
#!
in der ersten Zeile nach dieser Zeichenfolge ( ). Wenn es es findet, führt es das dort angegebene Shell-Programm aus und übergibt den Dateinamen als Parameter. (zB wenn die Datei mit/home/me/foo
beginnt#!/bin/sh
, wird der Kernel ausgeführt/bin/sh /home/me/foo
).Als nächstes
bin/sh
liest die Shell ( oder welches Interpreter-Programm auch immer angegeben wurde) die Datei. Die Shell weiß nichts über Shebang-Zeilen, liest aber trotzdem die erste Zeile, da sie genau wie jede andere Zeile in der Datei ist ... sie liest sie alle. Sie möchten nicht, dass die Shell abstürzt oder ihr Verhalten in irgendeiner Weise ändert. Die Vorgehensweise besteht darin, sie als Kommentar zu behandeln und zu ignorieren. Das beste Zeichen für einen Kernel-Befehl wäre daher das Kommentarzeichen.quelle
Es muss ein Kommentar sein, da nur so auch ein Skript wie "Interpretername Skriptname" ausgeführt werden kann. Ich weiß nicht über den Ursprung des "!".
quelle