Shebang

Zeichenkombination „#!“ am Anfang eines Skriptprogramms
#!

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

Bearbeiten

Der Begriff Shebang stammt mit ziemlich hoher Sicherheit aus dem Amerika des 19. Jahrhunderts. Der Ausdruck bezeichnet ursprünglich wahrscheinlich entweder eine Hütte, Unterkunft oder auch ein Zelt, eventuell einen Ort, wo unlizenzierter Alkohol getrunken wird (irisch Shebeen). Ab Mitte des 19. Jahrhunderts bezeichnet der Begriff aber auch eine Pferdekutsche (so verwendet zum Beispiel von Mark Twain).

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 im Zusammenhang mit Quartiermeistern entstand.

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

Bearbeiten

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.[1] Da Version 8 des Unix von Bell nicht mehr veröffentlicht wurde, wurde der Shebang erst durch BSD in großem Stil bekannt.

Implementierung

Bearbeiten

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

Bearbeiten
 
Ein Hallo-Welt-Programm in Perl. Die erste Zeile enthält den Pfad zum Interpreter sowie ein Argument (-w).

Eine typische Shebang-Zeile sieht so aus:

#!/bin/sh

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

Bearbeiten

Speicherort

Bearbeiten

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:

#!/usr/bin/env python

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:

user@localhost:~$ type python
python is /usr/bin/python

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:

#!C:\Programme und Anwendungen\Python 2.48\bin\python.exe

Shebang als Sonderform eines Kommentars in der Skriptsprache

Bearbeiten

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.[2] 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.[2] 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.[3][4]

Unicode Byte Order Mark am Dateianfang

Bearbeiten

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.

Siehe auch

Bearbeiten
  • Erkennung des korrekten Interpreters bei Binärdateien unter Linux: binfmt misc

Einzelnachweise

Bearbeiten
  1. Archivauszug von 1980 auf in-ulm.de; bereits vorhanden in Version 4BSD und standardmäßig aktiviert in Version 4.2BSD
  2. a b Deutsche Dokumentation zu InstantFPC
  3. SRFI-22
  4. The D Language Foundation: D Programming Language Specification. (PDF, 1,46 MB) S. 5, archiviert vom Original (nicht mehr online verfügbar) am 3. Oktober 2017; abgerufen am 17. Oktober 2017 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/dlang.org
Bearbeiten