Zum Inhalt springen

Shebang

aus Wikipedia, der freien Enzyklopädie
#!

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.

Der Shebang-Mechanismus wurde erstmals 1980 im Quelltext von 4.0BSD veröffentlicht.[1] Die Funktion war zunächst inaktiv und konnte nur beim Übersetzen des Unix-Quelltexts händisch aktiviert werden. 1981 wurde die Auswertung des Shebang auf 2.8BSD portiert, das einen von 4BSD unabhängigen Entwicklungszweig der Siebten Ausgabe von UNIX (Unix V7) darstellt: der Shebang-Mechanismus in 2.xBSD stammt allerdings vom United States Geological Survey in Menlo Park, nicht von Berkeley.[2] In 4.2BSD von 1983 wurde eine von Robert Elz überarbeitete Variante des Mechanismus erstmals per Voreinstellung aktiviert.[3] In den kommerziellen UNIX-Betriebssystemen der Bell Labs war der Mechanismus erst ab System V SVR4 von 1988 enthalten.[4] In Linux ist die Auswertung des Shebang spätestens seit der Kernel-Version 0.10 enthalten.[5] Für die freien BSD-Derivate musste der Quelltext für den Shebang-Mechanismus nach dem 1994 beigelegten Streit um die Rechte an UNIX nachprogrammiert werden.[6]

Wie es dazu kam, die auch „Magic Line[7] genannte erste Zeile von Shellskripten (siehe Magische Zahl)[8] mit „Shebang“ zu bezeichnen, ist nicht bekannt.[9] Im Unix-Kontext kann „Shebang“ jedoch als Verkürzung von sharp bang oder hash bang gedeutet werden, was sich auf die ersten zwei Zeichen bezieht. Das Rautezeichen heißt auf Englisch auch sharp oder hash, und bang ist Jargon[10] für das Ausrufezeichen.[9][7][8] Es besteht allerdings die Möglichkeit, dass die US-amerikanische Redewendungthe whole shebang“ die Wortschöpfung beeinflusst hat.[11]

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.[12] 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 | Quelltext 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.

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.

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 | Quelltext 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.[13] 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.[13] 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.[14][15]

Unicode Byte Order Mark am Dateianfang

[Bearbeiten | Quelltext 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.

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

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. Sven Mascheck: The #! magic, details about the shebang/hash-bang mechanism on various Unix flavours. (HTML) 20. Oktober 2021, abgerufen am 5. April 2025 (englisch): „The Origin – … an old mail from Dennis Ritchie introducing the new feature … So this #! mechanism origins from Bell Labs, between Version 7 and Version 8, and was then available on 4.0BSD (~10/'80), although not activated per default.“
  2. Sven ascheck: The #! magic, details about the shebang/hash-bang mechanism on various Unix flavours. (HTML) 20. Oktober 2021, abgerufen am 5. April 2025 (englisch): „The Origin – … Less than a year after 4.0BSD, but more than two years before 4.2 BSD, #! was also added to 2.8BSD (~07/'81), but not active by default. 2.x BSD is a different development line, independent from 4 BSD. It's a 7th edition (V7) kernel with fixes activated by macros. The macro for the #! code is not present in a makefile, so you had to activate it yourself. The code wording is slightly different from 4 BSD. On 2.8 BSD, #! seems to come from the U.S. Geological Survey in Menlo Park, not from Berkeley.“
  3. Sven ascheck: The #! magic, details about the shebang/hash-bang mechanism on various Unix flavours. (HTML) 20. Oktober 2021, abgerufen am 5. April 2025 (englisch): „The Origin – … It was then implemented by default on 4.2BSD (~09/'83), /usr/src/sys/sys/kern_exec.c by Robert Elz.“
  4. Sven ascheck: The #! magic, details about the shebang/hash-bang mechanism on various Unix flavours. (HTML) 20. Oktober 2021, abgerufen am 5. April 2025 (englisch): „The Origin – … Among the public releases from Bell Labs, #! was not added until SVR4 ('88) according to a TUHS list discussion. System III and SVR1 definitely had not implemented it, yet.“
  5. Sven ascheck: The #! magic, details about the shebang/hash-bang mechanism on various Unix flavours. (HTML) 20. Oktober 2021, abgerufen am 5. April 2025 (englisch): „Further history and the maximum length of a #! line: … On Linux, #! was introduced with kernel release 0.09 or 0.10 (0.08 had not implemented it, yet).“
  6. Sven ascheck: The #! magic, details about the shebang/hash-bang mechanism on various Unix flavours. (HTML) 20. Oktober 2021, abgerufen am 5. April 2025 (englisch): „The Origin – … In 4.3BSD Net/2 the code was removed due to the license war and had to be reimplemented for the descendants (e.g., NetBSD, 386BSD, BSDI).“
  7. a b Peter Mandl: Einführung in die Bash: Konzepte, Kommandos und Programmierung. Springer Vieweg, 2024, ISBN 978-3-662-69196-0, 6.2 Aufbau und Aufruf eines Bash-Skripts, S. 82 (eingeschränkte Vorschau in der Google-Buchsuche [abgerufen am 5. April 2025]): „Ganz am Anfang eines Skripts wird die Shell spezifiziert, mit der die weiteren Anweisungen interpretiert werden sollen. Die Zeichenkombination #! wird auch als Shebang oder Magic Line bezeichnet.“
  8. a b Robert Baumgartl: Betriebssysteme für Dummies. 1. Auflage. Wiley-VCH, Weinheim, Deutschland 2025, ISBN 978-3-527-71813-9, 2. Bedienung, bitte: Wie man mit Linux umgeht (eingeschränkte Vorschau in der Google-Buchsuche [abgerufen am 5. April 2025]): „Die beiden Zeichen #! werden im UNIX Shebang genannt. Sie sind ein Beispiel für einen Magic String, das ist eine charakteristische Bytesequenz, anhand derer das System erkennen kann, was es mit der enthaltenen Datei machen kann.“
  9. a b Jörg Schorn: UNIX Shellprogrammierung. Walter de Gruyter, Berlin/Boston 2018, ISBN 978-3-11-044511-4, 3.2.1 Shebang, S. 29 (eingeschränkte Vorschau in der Google-Buchsuche [abgerufen am 5. April 2025]): „Warum die Zeichenfolge ‚#!‘ als Shebang bezeichnet wird, ist nicht zu hundert Prozent geklärt. Es wird oft vermutet, dass sie als Abkürzung von Hashbang genutzt wird. Das Doppelkreuz ‚#‘ wird als Hash und das Ausrufezeichen ‚!‘ als Bang bezeichnet.“
  10. Max Fellmann: Keine Frage; Wir brauchen dieses Satzzeichen. In: SZ Magazin, Heft 45/2013. Süddeutsche Zeitung, 7. November 2013, abgerufen am 6. April 2025: „… ›bang‹, unter englischsprachigen Druckern ein Slang-Ausdruck für das Ausrufezeichen.“
  11. Sven ascheck: The #! magic, details about the shebang/hash-bang mechanism on various Unix flavours. (HTML) 20. Oktober 2021, abgerufen am 5. April 2025 (englisch): „And why shebang? In music, ‘#’ means sharp. So just shorten #! to sharp-bang. Or it might be derived from ‘shell bang’. All this probably under the influence of the american slang idiom ‘the whole shebang’ (everything, the works, everything involved in what is under consideration). See also the wiktionary, jargon dictionary or Merriam-Websters. Sometimes it's also called hash-bang, pound-bang, sha-bang/shabang, hash-exclam, or hash-pling (british, isn't it?).
    According to Dennis M. Ritchie (email answer to Alex North-Keys) it seems it had no name originally.
    And Doug McIllroy mentioned in the TUHS mailing list, that the slang for # at Bell Labs most probably was ‘sharp’ at the time.“
  12. Archivauszug von 1980 auf in-ulm.de; bereits vorhanden in Version 4BSD und standardmäßig aktiviert in Version 4.2BSD
  13. a b Deutsche Dokumentation zu InstantFPC
  14. SRFI-22
  15. 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