Top-Fragen
Zeitleiste
Chat
Kontext

Shebang

Zeichenkombination „#!“ am Anfang eines Skriptprogramms Aus Wikipedia, der freien Enzyklopädie

Remove ads

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]

Remove ads

Etymologie

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]

Remove ads

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

Remove ads

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

Thumb
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.

Remove ads

Probleme

Zusammenfassung
Kontext

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:

#!/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

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

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

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.

Remove ads

Siehe auch

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

Einzelnachweise

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads