# Shebang

Shebang oder Hash-Bang bezeichnet die Zeichenkombination #! am Anfang eines Skriptprogramms, ähnlich einer Dokumenttypdefinition. Bei unixoiden Betriebssystemen führt die Markierung mit Rautezeichen und Ausrufezeichen dazu, dass das folgende Kommando mitsamt allen angegebenen Argumenten beim Aufruf des Programms ausgeführt wird. Der Dateiname wird dann als weiteres Argument übergeben.

## Etymologie

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 Rautezeichen 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 entweder Kommentare einleiten („#“), oder – im Fall von „:“ – den Aufruf einer leeren Funktion (NOP) darstellen und daher ohne Beeinträchtigung der Funktionalität des Skriptes in die Dateien eingebaut werden können.
Der Shebang wurde von Dennis Ritchie in der Zeit zwischen den Unix-Versionen 7 und 8 der Bell Laboratories eingeführt. In derselben Zeit wurde es in BSD-Unix übernommen. Da Version 8 des Unix von Bell nicht mehr veröffentlicht wurde, wurde der Shebang erst 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 Betriebssystemkern die Datei bereits als Skript erkennen und mit dem angegebenen Interpreter ausführen. Das Skript gilt auf diese Weise als nahezu vollwertiges Programm und kann als solches im Betriebssystem aufgerufen werden.

## Verwendung

Eine typische Shebang-Zeile sieht so aus:
Diese Zeile weist das Betriebssystem an, diese Datei mit dem Interpreter-Programm /bin/sh auszuführen, in diesem Fall also der Standard-Unix-Shell.
Die Shebang-Zeile #!/bin/cat macht ein Programm zu einem (unechten) Quine, das seinen Inhalt auf die Standardausgabe ausgibt, indem es seinen Namen dem Programm cat übergibt.

## Probleme
### Speicherort

Einige Speicherorte sind im Filesystem Hierarchy Standard (FHS) normiert, sodass FHS-konforme Unix-artige Systeme die entsprechende Programme, oder symbolische Verknüpfungen darauf, am normierten Pfad vorhalten müssen. So ist eine POSIX-kompatible Unix-Shell immer unter /bin/sh. Jedoch sind nicht alle Unix-Derivate FHS-konform, und der Speicherort für weitere Interpreter ist nicht normiert. Daher kann es notwendig sein, 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:
env startet das gewünschte Programm (hier Python) unabhängig vom Speicherort, indem es die Standard-Umgebungsvariablen der Betriebssystemkonfiguration lädt – und damit auch die Umgebungsvariable PATH – und dann nach dem Programm python in diesen 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.
Ist der Speicherort unklar, können auch die Kommandozeilen-Befehle type, command -v oder which weiterhelfen:

### Windows

Windows kennt das Shebang grundsätzlich nicht. Werden aber Programmpakete, die für Windows und Unix gleichermaßen entwickelt wurden, unter Windows installiert, so interpretieren oft einige Programmteile das Shebang. So „versteht“ beispielsweise der Apache-Webserver Shebangs, wenn er CGI-Skripte aufruft. Hier ein mögliches Beispiel, wie ein Python-Skript von Apache aufgerufen wird:

### Shebang als Sonderform eines Kommentars in der Skriptsprache

Durch die Verwendung des Shebangs können theoretisch beliebige Interpreter aufgerufen werden, denen dann das gesamte Script zur Verarbeitung übergeben wird. Die Verwendung des Shebangs als Aufruf für den Interpreter ist allerdings nur dann möglich, wenn das Shebang von diesem ignoriert wird, da diese keine Anweisung für den Interpreter selbst enthält. Durch das Rautezeichen wird das Shebang in vielen Skriptsprachen als Kommentar bewertet und damit ignoriert. Alternativ könnte der Interpreter immer die erste Zeile überspringen.
Bei gängigen Sprachen wie Ruby, Perl, Python oder PHP ist dies der Fall, da sie das Rautezeichen für Zeilenkommentare verwenden. Andere Sprachen hingegen verwenden andere Zeichen für (Zeilen-)Kommentare. REXX-Interpreter beispielsweise sehen dieses Zeichen allgemein als Syntaxfehler an. Aus diesem Grund sind nicht beliebige Interpreter für den Aufruf über den Shebang geeignet.
Mitunter adressiert das Shebang einen Präprozessor, der die Zeile auswertet, entfernt und den Rest an einen Interpreter oder Compiler übergibt. Dies ist beispielsweise bei InstantFPC der Fall, einem Kommando, das die Ausführung von Pascalskripten mit Free Pascal unter verschiedenen Betriebssystemen erlaubt. Obwohl Pascal das Zeichen "#" nicht als Kommentarkennzeichen verwendet, werden die Skripte fehlerfrei kompiliert und ausgeführt, da InstantFPC die Shebangzeile entfernt und sonstige Parameter extrahiert. Ab Version 0.9.31 erkennt auch Lazarus die Shebangzeile. In der Lisp-Variante Scheme und in D ist das Rautezeichen zwar allgemein kein Kommentar, aber die Shebang-Zeile wird vom Compiler als erste Zeile speziell ignoriert.

### Unicode Byte Order Mark am Dateianfang

Skriptdateien enthalten Text und zählen zu den Textdateien. Textdateien in Unicode-Kodierung beginnen oft mit einer Byte-Order-Markierung (BOM). Steht eine solche BOM am Anfang einer Skriptdatei, also vor der Shebang-Konstruktion, dann wird die Shebang-Konstruktion unter Umständen nicht erkannt (auch diese muss per Definition am Anfang stehen). Daher sollte bei Skripten, die ein Shebang nutzen, auf eine BOM am Dateianfang verzichtet werden.