Shebang ( anglicky shebang, sha-bang , [1] [2] [3] hashbang , [4] [5] pound-bang , [2] [6] nebo hash-pling [2] [7] ) - v programování , posloupnost značek hash a vykřičník (" #! ") na začátku souboru skriptu .
Když je skript s shebang spuštěn jako program na operačních systémech podobných Unixu, zavaděč programu považuje zbytek řádku po shebang za název souboru interpretačního programu . Zavaděč spustí tento program a předá mu název souboru skriptu s parametrem shebang. [8] Pokud je například úplný název souboru skriptu " path/to/script" a první řádek tohoto souboru je:
#!/bin/shpak zavaděč spustí " /bin/sh" (obvykle Bourne shell nebo kompatibilní interpret příkazového řádku) a předá " path/to/script" jako první parametr.
Řádek shebang je obvykle interpretem přeskočen, protože znak "#" je počáteční znak pro komentáře v mnoha skriptovacích jazycích. Někteří interpreti, kteří nepoužívají znak hash k označení začátku komentářů (jako je Scheme ), mohou vynechat řádek shebang, čímž definují jeho účel. [9] Jiná řešení spoléhají na preprocesor, který zpracuje a odstraní řádek shebang předtím, než je zbytek skriptu předán kompilátoru nebo interpretu. Funguje tedy například InstantFPC , který umožňuje na některých operačních systémech spouštět programy napsané ve Free Pascalu jako skripty. [deset]
Řetězec shebang má následující formát: [8]
#! interpret [ optional-arg ]interpreter musí být absolutní cesta ke spustitelnému [1] programovému souboru (pokud je interpretem skript, musí také začínat znakem shebang). Nepovinný volitelný argument musí být ve formátu jednoho argumentu (z důvodů přenositelnosti nesmí obsahovat mezery). Mezera za #! je volitelná. [2]
Několik typických linií Shebang:
Řádky Shebang mohou obsahovat další argumenty, které jsou předány interpretu (viz příklad v Perlu výše). Protože se však zpracování argumentů může lišit, z důvodu přenositelnosti je nejlepší použít pouze jeden argument bez mezer uvnitř. Další pokyny pro přenositelnost jsou uvedeny níže.
Zadání tlumočníka na řádku shebang umožňuje použití skriptových a datových souborů jako systémových příkazů, skrytí podrobností o implementaci před uživateli a jinými programy tím, že odpadá nutnost zadávat soubor tlumočníka na příkazovém řádku před souborem skriptu.
Předpokládejme, že skript Bourne shell je v souboru " some/path/to/foo ", jehož první řádek je
#!/bin/sh -xPokud se uživatel pokusí spustit tento soubor skriptu pomocí příkazového řádku (zadáním "bar" a "baz" jako argumentů)
some/path/to/foo bar bazpak výsledek bude stejný jako při spuštění příkazu:
/bin/sh -x some/path/to/foo bar bazPokud je cesta " /bin/sh " programem Bourne shell , pak "bar" a "baz" budou přiřazeny k pozičním parametrům $1shellu $2a všechny řádky souboru " some/path/to/foo " budou být provedeny jako příkazy tohoto shellu . Vzhledem k tomu, že znak libra je znakem začátku komentáře v Bourne shellu (a mnoha dalších shellech), bude řádek shebang přeskočen.
Je však na samotném interpretovi, aby určil konečné zpracování řetězce shebang. Skript obsahující následující dva řádky by tedy jednoduše vytiskl oba řádky na standardní výstup :
#!/bin/cat Ahoj světe!Ve srovnání s používáním globálního mapování přípony souboru na aplikaci tlumočníka vám zadání řetězce vyvolání tlumočníka v shebang umožňuje určit tlumočníka, který není globálně známý a nevyžaduje oprávnění správce systému. Shebang vám také umožňuje specifikovat interpreta individuálně pro soubor, aniž byste zaváděli komplikovaný koncept jmenného prostoru pro mapování jedné přípony na více interpretů.
Shebang musí udávat absolutní cestu (nebo cestu relativní k aktuálnímu pracovnímu adresáři) pro spustitelné soubory. To může vést k problémům u systémů s nestandardní strukturou souborového systému. I na systémech s poměrně standardními adresáři je možné, že varianty stejného operačního systému uloží požadovaný interpret na různých místech. Python může být například v /usr/bin/python , /usr/local/bin/python nebo dokonce /home/ username /bin/python , pokud jej nainstaloval někdo jiný než správce systému.
Pro lepší přenositelnost se proto používá /usr/bin/env, který má možnost vyhledat program v PATH , například:
#!/usr/bin/env pythonV tomto případě, kdekoli je interpret Pythonu umístěn, bude spuštěn.