- Hashbang
-
Bei unixoiden Betriebssystemen wird die Zeichenkombination
#!
am Anfang eines Skript-Programms shebang oder auch Magic Line genannt. Die Markierung führt dazu, dass das folgende Kommando mitsamt aller angegeben Argumente ausgeführt wird. Der Dateiname wird dann als weiteres Argument übergeben. Andere Betriebssysteme, z. B. Windows, nutzen die Technik nicht. Nur bei speziellen Umgebungen, wie dem Common Gateway Interface im Apache HTTP Server, spielt die Shebang-Konstruktion auf diesen Systemen eine Rolle.Inhaltsverzeichnis
Etymologie
Der Begriff Shebang stammt mit ziemlich hoher Sicherheit aus dem Amerika des 19. Jahrhunderts. Der Term bezeichnet ursprünglich wahrscheinlich entweder eine Hütte, Unterkunft oder auch ein Zelt, eventuell einen Ort, wo unlizenzierter Alkohol getrunken wird (vom Irischen, Shebeen), aber auch eine Pferdekutsche (so verwendet zum Beispiel von Mark Twain ab Mitte des 19. Jahrhunderts).
Shebang wird aber seit über 150 Jahren im Normalfall innerhalb des Ausdrucks „the whole shebang“ verwendet, was grob übersetzt „Kram, Sache, Angelegenheit“ bedeutet. Dies scheint von „running the whole shebang“ herzustammen, einem Ausdruck, der im späten amerikanischen Bürgerkrieg entstand und im Zusammenhang mit Offizieren verwendet wurde, die die Zelte, das Zeltlager und die Einheit in Gang hielten.
Im Unix-Kontext wird es als Verkürzung von sharp bang oder hash bang gedeutet, was sich auf die zwei Anfangszeichen bezieht. Im Unix-Jargon wird das Ausrufezeichen als bang und das Rautenzeichen als hash oder auch sharp bezeichnet.
Geschichte
Der Mechanismus wurde in seiner ursprünglichen Form eingeführt, um Shellskript-Dateien für die unterschiedlichen Unix-Shells sh und csh voneinander unterscheiden zu können. Dabei wurde anhand des ersten Zeichens der Datei entschieden, wenn es entweder „:“ oder „#“ lautete. Dies sind Zeichen, die in der jeweiligen Skriptsprache Kommentare einleiten und daher ohne Beeinträchtigung der Funktion in die Dateien eingebaut werden können.
Der Shebang wurde von Dennis Ritchie in der Zeit zwischen Version 7 Unix und Version 8 Unix der Bell Labs eingeführt. In der gleichen Zeit wurde es zu dem BSD-Unix von Berkeley hinzugefügt[1]. Da Version 8 des Unix von Bell nicht mehr veröffentlicht wurde, wurde der Shebang durch BSD in großem Stil bekannt.
Implementierung
Die Shebang-Zeichen stellen eine im ASCII-Zeichensatz für Menschen lesbare Form einer magischen Zahl für ausführbare Programme dar, der magische String entspricht hexadezimal
0x23 0x21
. Damit kann der Kernel des Betriebssystems die Datei bereits als Skript erkennen und mit dem angegebenen Interpreter ausführen. Das Skript gilt auf diese Weise als vollwertiges Programm und kann als solches im Betriebssystem aufgerufen werden. Voraussetzung ist, wie bei jedem Programm, dass die Unix-Dateirechte korrekt gesetzt sind, d. h. das Ausführbit gesetzt ist.Verwendung
Eine typische Shebang-Zeile könnte so aussehen:
#!/bin/sh
Diese Zeile weist das Betriebssystem an, diese Datei mit dem Interpreter-Programm
/bin/sh
, in diesem Fall also der Standard-Unix-Shell, auszuführen.Die Shebang-Zeile
#!/bin/cat
macht ein Programm zu einem (unechten) Quine, das nichts anderes tut, als seinen Inhalt zur Standardausgabe auszugeben, indem es seinen Namen dem Programmcat
übergibt.Probleme
Speicherort
Unter den verschiedenen Unix-Derivaten ist der Speicherort für den gleichen Interpreter oft unterschiedlich. Daher ist es häufig notwendig, die shebang-Zeile zu ändern, wenn ein Skript von einem Computer zu einem anderen kopiert wird.
Um hier Abhilfe zu schaffen, kann man das Programm env benutzen;
#!/usr/bin/env python
env startet das gewünschte Programm (hier Python) unabhängig vom Speicherort, in dem es die Standard-Umgebungsvariablen der Betriebssystemkonfiguration lädt – und damit auch die Umgebungsvariable
PATH
– und dann nach dem Programm python in den Programmpfaden sucht. Auf diese Weise findet es in diesem Beispiel den Pythoninterpreter unter/usr/bin/python
. Allerdings ist auch env nicht auf jedem System installiert und nicht unbedingt immer an derselben Stelle zu finden.Unter Windows werden Shebang-Konstrukte nicht verwendet, außer bei CGI-Programmen. Da Windows ein anderes System hat, Ordner und Partitionen anzusprechen, und es auch keinen standardisierten Pfad zu Anwendungsprogrammen gibt, gibt es quasi keine einheitliche Shebang-Zeilen, die für mehrere Windows-Installationen Gültigkeit hätten. Das obige Beispiel könnte für Windows beispielsweise
#!C:\Programme und Anwendungen\Python 2.48\bin\python.exe
heißen, aber auch
#!D:\programs\Small programs\UNIX Interpreters\python 2.48\python.exe
Kommentar in der Skriptsprache
Die Verwendung des Shebang ist nur möglich, wenn es vom jeweiligen Interpreter zumindest in der ersten Zeile als Kommentar erkannt und damit ignoriert wird. Bei gängigen Sprachen wie Perl oder Python ist dies problemlos möglich, da sie das Rautenzeichen für Zeilenkommentare verwenden, andere Sprachen hingegen verwenden andere Zeichen für (Zeilen)kommentare. REXX-Interpreter beispielsweise sehen dieses Zeichen allgemein als Syntaxfehler an, Interpreter für Linux müssen die erste Zeile folglich tolerieren.
Unicode Byte Order Mark am Dateianfang
Steht am Anfang von Textdateien in Unicode-Kodierung eine Byte Order Mark-Markierung (noch vor den Shebang-Zeichen), so wird die Shebang-Konstruktion nicht als solche erkannt. Daher muss bei Skripten, die ein Shebang nutzen, auf eine BOM am Dateianfang verzichtet werden.
Zeilenende
Wenn die Shebang-Zeile ein für das Betriebssystem unpassendes Zeilenumbruchzeichen verwendet, treten Fehler auf. So ist es unter Unix zwingend nötig, dass eine Shebang-Zeile nur mit dem Linefeed-Zeichen (
LF
) beendet wird. Windows-Zeilenendungen haben vor demLF
-Zeichen noch ein Wagenrücklaufzeichen (CR
). Unter Unix wird diesesCR
-Zeichen dann fälschlicherweise an den Namen des aufzurufenden Skript-Interpreters angefügt.Beispiel für Steuerzeichenproblem Skriptdatei mit Unix-Zeilenende Skriptdatei mit Windows-Zeilenende Text der Datei test.pl #!/usr/bin/perl # dies ist ein Kommentar print("Hallo Welt");
#!/usr/bin/perl # dies ist ein Kommentar print("Hallo Welt");
Hexdump der Datei 23 21 2f 75 73 72 2f 62 #!/usr/b
69 6e 2f 70 65 72 6c 0a in/perl.
23 20 64 69 65 73 20 69 # dies i
73 74 20 65 69 6e 20 4b st ein K
6f 6d 6d 65 6e 74 61 72 ommentar
0a 70 72 69 6e 74 28 22 .print("
48 61 6c 6c 6f 20 57 65 Hallo We
6c 74 22 29 3b lt");23 21 2f 75 73 72 2f 62 #!/usr/b
69 6e 2f 70 65 72 6c 0d in/perl.
0a 23 20 64 69 65 73 20 .# dies
69 73 74 20 65 69 6e 20 ist ein
4b 6f 6d 6d 65 6e 74 61 Kommenta
72 0d 0a 70 72 69 6e 74 r..print
28 22 48 61 6c 6c 6f 20 ("Hallo
57 65 6c 74 22 29 3b Welt");Beim Ausführen der beiden gleichen Programme, die verschiedene Zeilenenden aufweisen, auf den jeweiligen Plattformen wird man die Ausgabe
Hallo Welt
bekommen. Versucht man das Windows-Programm unter Unix auszuführen, endet dies mit einem Fehler, zum Beispiel:$ ./test.pl bash: ./test.pl: /usr/bin/perl^M: bad interpreter: Datei oder Verzeichnis nicht gefunden
Das
^M
ist dabei das Steuerzeichen, welches für das WagenrücklaufzeichenCR
steht. Nur durch Umwandeln der Datei zu Unix-Zeilenenden kann diese Shebang-Zeile genutzt werden.Siehe auch
- Erkennung des korrekten Interpreters bei Binärdateien unter Linux: binfmt_misc
Weblinks
- ↑ http://www.in-ulm.de/~mascheck/various/shebang/sys1.c.html; bereits vorhanden in Version 4BSD und standardmäßig aktiviert in Version 4.2BSD)
- Details about the shebang mechanism on various Unix flavours (engl.)
- Aus der Jargon-File: shebang (engl.)
- Definition des Wortes im Webster's Dictionary: shebang (engl.)
- #! - the Unix truth as far as I know it. – umfassender Artikel über den Shebang (engl.)
Wikimedia Foundation.