Shebang


Shebang
Die Shebang-Zeichen – hash-bang

Shebang (auch Magic Line) bezeichnet bei unixoiden Betriebssystemen die Zeichenkombination #! am Anfang eines Skriptprogramms. Die Markierung führt dazu, dass das folgende Kommando mitsamt allen angegebenen Argumenten beim Aufruf des Programms ausgeführt wird. Der Dateiname wird dann als weiteres Argument übergeben. Andere Betriebssysteme – beispielsweise Microsoft 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 Ausdruck bezeichnet ursprünglich wahrscheinlich entweder eine Hütte, Unterkunft oder auch ein Zelt, eventuell einen Ort, wo unlizenzierter Alkohol getrunken wird (irisch 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 (sogen. Quartiermeistern).

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 Doppelkreuz 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 den Unix-Versionen 7 und 8 der Bell Laboratories eingeführt. In der gleichen Zeit wurde es in BSD-Unix übernommen.[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 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. Voraussetzung ist, wie bei jedem Programm, dass die Unix-Dateirechte korrekt gesetzt sind, das heißt, dass das Ausführbit gesetzt ist.

Bei Skripten mit Shebang werden vom Linuxkernel die SUID- und SGID-Flags ignoriert.

Verwendung

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

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 seinen Inhalt auf die Standardausgabe ausgibt, indem es seinen Namen dem Programm cat ü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, 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.

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

Beim Portieren von Skripten von Windows nach Unix und umgekehrt sollte man auf Zeilenumbruch-, Wagenrücklauf-, Dateiende- und sonstige Sonderzeichen achten, um Probleme zu vermeiden.

Kommentar in der Skriptsprache

Die Verwendung des Shebangs 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 Ruby, Perl oder Python ist dies problemlos möglich, da sie das Doppelkreuz 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 Unix-ähnliche Betriebssysteme müssen die erste Zeile folglich tolerieren (z. B. als Sonderbehandlung wie bei PHP[2][3]).

Unicode Byte Order Mark am Dateianfang

Skriptdateien enthalten Text und zählen zu den Textdateien. Textdatein 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.

Zeilenende

Neben dem ersten Zeichen der Datei ist auch das letzte Zeichen der ersten Zeile, also das Zeilenumbruchzeichen, für die korrekte Interpretation relevant. Wird ein für das Betriebssystem unpassendes Zeilenumbruchzeichen verwendet, dann wird das auszuführende Kommando zwangsweise falsch interpretiert. So ist es unter Unix zwingend nötig, dass eine Shebang-Zeile nur mit dem Linefeed-Zeichen (LF) beendet wird. Windows-Zeilenendungen haben vor dem LF-Zeichen noch ein Wagenrücklaufzeichen (CR). Unter Unix wird dieses CR-Zeichen dann fälschlich 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ücklaufzeichen CR steht. Nur durch Umwandeln der Datei zu Unix-Zeilenenden kann diese Shebang-Zeile genutzt werden.

In der Praxis tritt dieses Phänomen in der Regel nur bei der Portierung des Programmes auf eine andere Plattform auf. Bei Skripten, die eigentlich Plattformunabhängigkeit aufweisen, führt dies analog zu obigen genannten Problemen zu Handlungsbedarf.

Siehe auch

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

Einzelnachweise

  1. Archivauszug von 1980 auf in-ulm.de; bereits vorhanden in Version 4BSD und standardmäßig aktiviert in Version 4.2BSD)
  2. PHP auf der Kommandozeile. In: PHP Manual. 21. Jan. 2011, abgerufen am 26. Jan. 2011 (deutsch).
  3. Executing PHP files. In: PHP Manual. 9. April 2010, abgerufen am 10. April 2010 (englisch).

Weblinks


Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Shebang! — is an all female breakdance crew in Toronto, Ontario, Canada. The group is comprised of b girls with the stage names Blazin , jennrock, mae hem, Ms. Mighty, and DJ Dalia.shebang! has performed with notable artists including the Beastie Boys,… …   Wikipedia

  • Shebang — is a slang term for the matter at hand, as in the phrase, the whole shebang . The word is also slang for a party, gathering or event, such as I m throwing a little shebang at the barn tonight . The word can also refer to:* Shebang (Unix), the #!… …   Wikipedia

  • Shebang — es, en la jerga de Unix, el nombre que recibe el par de caracteres #! que se encuentran al inicio de los programas ejecutables interpretados. A continuación de estos caracteres se indica la ruta completa al intérprete de las órdenes contenidas en …   Wikipedia Español

  • shebang — 1862, hut, shed, shelter, perhaps an alteration of SHEBEEN (Cf. shebeen) (q.v.). Phrase the whole shebang first recorded 1869, but relation to the earlier use of the word is obscure. Either or both senses may also be mangled pronunciations of Fr …   Etymology dictionary

  • shebang — ► NOUN informal ▪ a matter, operation, or situation: the whole shebang. ORIGIN originally US, in the sense «a rough hut or shelter»; of unknown origin …   English terms dictionary

  • shebang — ☆ shebang [shə baŋ′ ] n. [prob. var. of SHEBEEN] 1. a shack or hut 2. Informal an affair, business, contrivance, thing, etc.: chiefly in the whole shebang …   English World dictionary

  • Shebang — She*bang , n. [Cf. {Shebeen}.] A jocosely depreciative name for a dwelling or shop. [Slang,U.S.] [1913 Webster] …   The Collaborative International Dictionary of English

  • Shebang — Le shebang, représenté par #!, est un en tête d un fichier qui indique au système que ce fichier est un ensemble de commandes pour l interpréteur indiqué, possiblement un mot valise pour sharp bang[1]. On trouve aussi d autres dénominations  …   Wikipédia en Français

  • shebang — /ʃəˈbæŋ / (say shuh bang) Colloquial –noun 1. a thing; affair; business. 2. a disturbance; brawl. –phrase 3. the whole shebang, the totality of something; the lot; everything: *So I m going to give em a picnic, see? The whole shebang. –ruth park …   Australian English dictionary

  • shebang — noun a) Any matter of present concern; thing; or business. Before Id share anything with you, he said bitterly, Id lose the whole shebang. b) A lean to or temporary shelter. <! [sic] all in one paragraph […] So they got into the empty omnibus… …   Wiktionary