Umístění programuEdit
Shebangy musí zadávat absolutní cesty (nebo cesty relativní k aktuálnímu pracovnímu adresáři) ke spustitelným souborům systému; to může způsobit problémy v systémech s nestandardním uspořádáním souborového systému. I když mají systémy poměrně standardní cesty, je docela dobře možné, že varianty téhož operačního systému mají různá umístění požadovaného interpretu. Například Python může být v /usr/bin/python3, /usr/local/bin/python3 nebo dokonce něco jako /home/username/bin/python3, pokud je nainstalován běžným uživatelem.
Podobný problém existuje u shellu POSIX, protože POSIX vyžadoval pouze jeho název sh, ale nepředepisoval cestu. Běžná hodnota je /bin/sh, ale některé systémy, například Solaris, mají shell kompatibilní s POSIXem na adrese /usr/xpg4/bin/sh. V mnoha systémech Linux je /bin/sh pevný nebo symbolický odkaz na /bin/bash, Bourne Again shell (BASH). Použití syntaxe specifické pro bash při zachování shebang ukazujícího na sh také není přenositelné.
Z tohoto důvodu je někdy nutné upravit řádek shebang po zkopírování skriptu z jednoho počítače na druhý, protože cesta, která byla zakódována do skriptu, nemusí na novém počítači platit v závislosti na důslednosti minulé konvence umístění interpretu. Z tohoto důvodu a proto, že POSIX nestandardizuje názvy cest, POSIX tuto funkci nestandardizuje. Nástroj GNU Autoconf může testovat podporu systému pomocí makra AC_SYS_INTERPRETER.
Často lze toto omezení obejít pomocí programu /usr/bin/env zavedením úrovně indirekce. #!
následuje /usr/bin/env a za ním požadovaný příkaz bez úplné cesty, jako v tomto příkladu:
#!/usr/bin/env sh
Toto většinou funguje, protože cesta /usr/bin/env se běžně používá pro nástroj env,a vyvolá první sh nalezený v uživatelově $PATH, typicky /bin/sh.
To má stále určité problémy s přenositelností s OpenServerem 5.0.6 a Unicosem 9.0.2, které mají pouze /bin/env a nemají /usr/bin/env.
Interpretace znakůUpravit
Dalším problémem s přenositelností je interpretace argumentů příkazu. některé systémy, včetně Linuxu, argumenty nerozdělují; například při spuštění skriptu s prvním řádkem jako,
#!/usr/bin/env python3 -c
se veškerý text za první mezerou považuje za jeden argument, to znamená, že python3 -c
bude předán jako jeden argument do /usr/bin/env, a ne jako dva argumenty. Takto se chová i Cygwin.
Složitá volání interpretu jsou možná pomocí dodatečného wrapperu. FreeBSD 6.0 (2005) zavedlo do svého env volbu -S, protože změnilo chování při čtení shebangů na nerozdělené. Tato volba říká env, aby řetězec rozdělil sám. Nástroj GNU env od verze coreutil 8.30 (2018) tuto funkci také obsahuje. Ačkoli použití této volby zmírňuje problém přenositelnosti na straně jádra s dělením, přidává požadavek, aby env podporovalo toto konkrétní rozšíření.
Dalším problémem jsou skripty obsahující znak návratu vozíku bezprostředně za řádkem shebang, možná v důsledku editace v systému, který používá zalamování řádků DOS, například Microsoft Windows. Některé systémy interpretují znak návratu vozíku jako součást příkazu interpretu, což vede k chybovému hlášení.
Magické čísloEdit
Shebang je ve skutečnosti lidsky čitelná instance magického čísla ve spustitelném souboru, přičemž magický řetězec bajtů je 0x23 0x21, což je dvouznakové kódování v ASCII #!. Toto magické číslo je detekováno rodinou funkcí „exec“, které určují, zda je soubor skript nebo spustitelná binárka. Přítomnost shebang způsobí spuštění zadaného spustitelného souboru, obvykle interpretu jazyka skriptu. Tvrdí se, že některé staré verze Unixu očekávají, že za normálním shebangem bude následovat mezera a lomítko (#! /
), ale zdá se, že to není pravda; tradičně jsou spíše povoleny mezery za shebangem, které jsou někdy dokumentovány mezerou (viz e-mail z roku 1980 v části historie níže).
Znaky shebang jsou v rozšířených kódováních ASCII, včetně UTF-8, které se běžně používá pro skripty a další textové soubory v současných systémech podobných Unixu, reprezentovány stejnými dvěma bajty. Soubory UTF-8 však mohou začínat nepovinnou značkou pořadí bajtů (BOM); pokud funkce „exec“ specificky detekuje bajty 0x23 a 0x21, pak přítomnost BOM (0xEF 0xBB 0xBF) před shebangem zabrání spuštění interpretu skriptu. Některé autority nedoporučují používat značku pořadí bajtů ve skriptech typu POSIX (Unix-like), a to z tohoto důvodu a z širších důvodů interoperability a filozofických obav. Kromě toho není značka pořadí bajtů nutná v UTF-8, protože toto kódování nemá problémy s endianitou; slouží pouze k identifikaci kódování jako UTF-8.