ProgrammalocatieEdit
Shebangs moeten absolute paden specificeren (of paden relatief aan de huidige werkdirectory) naar systeemuitvoerbare bestanden; dit kan problemen veroorzaken op systemen die een niet-standaard indeling van het bestandssysteem hebben. Zelfs als systemen redelijk standaard paden hebben, is het goed mogelijk dat varianten van hetzelfde besturingssysteem verschillende locaties hebben voor de gewenste interpreter. Python, bijvoorbeeld, kan in /usr/bin/python3, /usr/local/bin/python3, of zelfs iets als /home/username/bin/python3 staan als het door een gewone gebruiker is geïnstalleerd.
Een soortgelijk probleem bestaat voor de POSIX-shell, omdat POSIX alleen vereist dat de naam sh is, maar geen pad voorschrijft. Een gebruikelijke waarde is /bin/sh, maar sommige systemen zoals Solaris hebben de POSIX-compatibele shell op /usr/xpg4/bin/sh. In veel Linux systemen is /bin/sh een harde of symbolische link naar /bin/bash, de Bourne Again shell (BASH). Het gebruik van bash-specifieke syntaxis met behoud van een shebang die naar sh wijst, is ook niet portable.
Om die reden is het soms nodig om de shebang regel aan te passen nadat een script van de ene computer naar de andere is gekopieerd, omdat het pad dat in het script was gecodeerd misschien niet van toepassing is op een nieuwe machine, afhankelijk van de consistentie in de conventie van plaatsing van de interpreter in het verleden. Om deze reden en omdat POSIX padnamen niet standaardiseert, standaardiseert POSIX deze functie niet. Het GNU Autoconf gereedschap kan testen op systeemondersteuning met de macro AC_SYS_INTERPRETER.
Vaak kan het programma /usr/bin/env worden gebruikt om deze beperking te omzeilen door een niveau van indirection in te voeren. #!
wordt gevolgd door /usr/bin/env, gevolgd door het gewenste commando zonder volledig pad, zoals in dit voorbeeld:
#!/usr/bin/env sh
Dit werkt meestal omdat het pad /usr/bin/env algemeen wordt gebruikt voor het hulpprogramma env, en het roept de eerste sh aan die in de $PATH van de gebruiker wordt gevonden, meestal /bin/sh.
Dit heeft nog steeds enkele portabiliteitsproblemen met OpenServer 5.0.6 en Unicos 9.0.2 die alleen /bin/env hebben en geen /usr/bin/env.
TekeninterpretatieEdit
Een ander portabiliteitsprobleem is de interpretatie van de commando argumenten.Sommige systemen, waaronder Linux, splitsen de argumenten niet op; bijvoorbeeld, wanneer het script wordt uitgevoerd met de eerste regel als,
#!/usr/bin/env python3 -c
wordt alle tekst na de eerste spatie behandeld als een enkel argument, dat wil zeggen, python3 -c
zal als een argument worden doorgegeven aan /usr/bin/env, in plaats van twee argumenten. Cygwin gedraagt zich ook zo.
Complexe interpreter-aanroepen zijn mogelijk door het gebruik van een extra wrapper. FreeBSD 6.0 (2005) introduceerde een optie -S in env toen het het gedrag van het shebang-lezen veranderde in niet-splitsen. Deze optie vertelt env om de string zelf te splitsen. Het GNU env hulpprogramma sinds coreutil 8.30 (2018) bevat deze mogelijkheid ook. Hoewel het gebruik van deze optie het portabiliteitsprobleem aan de kernelzijde met het splitsen vermindert, voegt het de vereiste toe dat env deze specifieke extensie ondersteunt.
Een ander probleem zijn scripts die een carriage return-teken direct na de shebang-regel bevatten, misschien als gevolg van het bewerken op een systeem dat DOS-regeleindes gebruikt, zoals Microsoft Windows. Sommige systemen interpreteren het carriage return karakter als onderdeel van het interpreter commando, wat resulteert in een foutmelding.
Magisch nummerEdit
De shebang is eigenlijk een door mensen leesbare instantie van een magisch nummer in het uitvoerbare bestand, de magische byte string is 0x23 0x21, de twee-karakter codering in ASCII van #!. Dit magische nummer wordt gedetecteerd door de “exec” familie van functies, die bepalen of een bestand een script is of een uitvoerbaar binair bestand. De aanwezigheid van de shebang zal resulteren in de uitvoering van het gespecificeerde uitvoerbare bestand, meestal een interpreter voor de taal van het script. Er is beweerd dat sommige oude versies van Unix verwachten dat de normale shebang gevolgd wordt door een spatie en een schuine streep (#! /
), maar dit blijkt niet waar te zijn; in plaats daarvan zijn spaties na de shebang van oudsher toegestaan, en soms gedocumenteerd met een spatie (zie de e-mail uit 1980 in de geschiedenissectie hieronder).
De shebang karakters worden door dezelfde twee bytes gerepresenteerd in uitgebreide ASCII coderingen, waaronder UTF-8, dat algemeen wordt gebruikt voor scripts en andere tekstbestanden op de huidige Unix-achtige systemen. UTF-8 bestanden kunnen echter beginnen met de optionele byte order mark (BOM); als de “exec” functie specifiek de bytes 0x23 en 0x21 detecteert, dan zal de aanwezigheid van de BOM (0xEF 0xBB 0xBF) voor de shebang voorkomen dat het script wordt uitgevoerd. Sommige autoriteiten raden het gebruik van een byte-volgorde markering in POSIX (Unix-achtige) scripts af, om deze reden en vanwege bredere interoperabiliteit en filosofische overwegingen. Bovendien is een byte-volgorde markering niet nodig in UTF-8, omdat die codering geen endianness problemen heeft; het dient alleen om de codering als UTF-8 te identificeren.