Program locationEdit
Shebangs müssen absolute Pfade (oder Pfade relativ zum aktuellen Arbeitsverzeichnis) zu den ausführbaren Dateien des Systems angeben; dies kann auf Systemen mit einem nicht standardisierten Dateisystemlayout zu Problemen führen. Selbst wenn Systeme relativ standardisierte Pfade haben, ist es durchaus möglich, dass Varianten desselben Betriebssystems unterschiedliche Speicherorte für den gewünschten Interpreter haben. Python kann sich beispielsweise in /usr/bin/python3, /usr/local/bin/python3 oder sogar in etwas wie /home/username/bin/python3 befinden, wenn es von einem normalen Benutzer installiert wurde.
Ein ähnliches Problem besteht für die POSIX-Shell, da POSIX nur verlangt, dass ihr Name sh lautet, aber keinen Pfad angibt. Ein üblicher Wert ist /bin/sh, aber einige Systeme wie Solaris haben die POSIX-kompatible Shell unter /usr/xpg4/bin/sh. In vielen Linux-Systemen ist /bin/sh ein harter oder symbolischer Link zu /bin/bash, der Bourne Again Shell (BASH). Die Verwendung einer BASH-spezifischen Syntax bei gleichzeitiger Beibehaltung eines Shebangs, der auf sh verweist, ist ebenfalls nicht portabel.
Aus diesem Grund ist es manchmal erforderlich, die Shebang-Zeile zu bearbeiten, nachdem ein Skript von einem Computer auf einen anderen kopiert wurde, da der Pfad, der in das Skript kodiert wurde, auf einem neuen Rechner möglicherweise nicht gilt, je nachdem, wie konsistent die Konvention über die Platzierung des Interpreters in der Vergangenheit war. Aus diesem Grund und weil POSIX keine Pfadnamen standardisiert, standardisiert POSIX diese Funktion nicht. Das GNU Autoconf-Werkzeug kann mit dem Makro AC_SYS_INTERPRETER auf Systemunterstützung testen.
Oft kann das Programm /usr/bin/env verwendet werden, um diese Einschränkung zu umgehen, indem eine Ebene der Indirektion eingeführt wird. #!
wird gefolgt von /usr/bin/env, gefolgt von dem gewünschten Befehl ohne vollständigen Pfad, wie in diesem Beispiel:
#!/usr/bin/env sh
Dies funktioniert meistens, weil der Pfad /usr/bin/env üblicherweise für das env-Dienstprogramm verwendet wird und es das erste sh aufruft, das im $PATH des Benutzers gefunden wird, normalerweise /bin/sh.
Dies hat immer noch einige Portabilitätsprobleme mit OpenServer 5.0.6 und Unicos 9.0.2, die nur /bin/env und kein /usr/bin/env haben.
ZeicheninterpretationBearbeiten
Ein weiteres Portabilitätsproblem ist die Interpretation der Befehlsargumente.Einige Systeme, einschließlich Linux, teilen die Argumente nicht auf; wenn man zum Beispiel das Skript mit der ersten Zeile wie,
#!/usr/bin/env python3 -c
ausführt, wird der gesamte Text nach dem ersten Leerzeichen als ein einziges Argument behandelt, d.h. python3 -c
wird als ein Argument an /usr/bin/env übergeben und nicht als zwei Argumente. Cygwin verhält sich ebenfalls auf diese Weise.
Komplexe Interpreteraufrufe sind durch die Verwendung eines zusätzlichen Wrappers möglich. FreeBSD 6.0 (2005) führte eine Option -S für env ein, als es das Verhalten des Shebang-Lesens auf „non-splitting“ änderte. Diese Option weist env an, die Zeichenkette selbst zu zerlegen. Das GNU env Dienstprogramm seit coreutil 8.30 (2018) enthält ebenfalls diese Funktion. Obwohl die Verwendung dieser Option das Portabilitätsproblem auf der Kernelseite mit dem Splitting entschärft, fügt sie die Anforderung hinzu, dass env diese spezielle Erweiterung unterstützt.
Ein weiteres Problem sind Skripte, die ein Wagenrücklaufzeichen direkt nach der Shebang-Zeile enthalten, vielleicht als Ergebnis der Bearbeitung auf einem System, das DOS-Zeilenumbrüche verwendet, wie Microsoft Windows. Einige Systeme interpretieren das Wagenrücklaufzeichen als Teil des Interpreter-Befehls, was zu einer Fehlermeldung führt.
Magische ZahlBearbeiten
Der Shebang ist eigentlich eine für den Menschen lesbare Instanz einer magischen Zahl in der ausführbaren Datei, wobei die magische Byte-Zeichenkette 0x23 0x21 ist, die Zwei-Zeichen-Kodierung in ASCII von #!. Diese magische Zahl wird von der „exec“-Funktionsfamilie erkannt, die feststellt, ob eine Datei ein Skript oder eine ausführbare Binärdatei ist. Das Vorhandensein des Shebang führt zur Ausführung der angegebenen ausführbaren Datei, normalerweise ein Interpreter für die Sprache des Skripts. Es wurde behauptet, dass einige alte Unix-Versionen erwarten, dass dem normalen Shebang ein Leerzeichen und ein Schrägstrich folgt (#! /
), aber das scheint nicht zu stimmen; stattdessen sind Leerzeichen nach dem Shebang traditionell erlaubt und manchmal mit einem Leerzeichen dokumentiert (siehe die E-Mail von 1980 im Abschnitt Geschichte unten).
Die Shebang-Zeichen werden durch dieselben zwei Bytes in erweiterten ASCII-Kodierungen dargestellt, einschließlich UTF-8, das häufig für Skripte und andere Textdateien auf aktuellen Unix-ähnlichen Systemen verwendet wird. UTF-8-Dateien können jedoch mit dem optionalen Byte Order Mark (BOM) beginnen; wenn die Funktion „exec“ speziell die Bytes 0x23 und 0x21 erkennt, verhindert das Vorhandensein des BOM (0xEF 0xBB 0xBF) vor dem Shebang die Ausführung des Skriptinterpreters. Einige Autoritäten raten von der Verwendung der Byte Order Mark in POSIX (Unix-ähnlichen) Skripten ab, sowohl aus diesem Grund als auch wegen allgemeiner Interoperabilität und philosophischer Bedenken. Außerdem ist eine Byte Order Mark in UTF-8 nicht notwendig, da diese Kodierung keine Endianness-Probleme hat; sie dient nur dazu, die Kodierung als UTF-8 zu identifizieren.