Shebang (UNIX)
A számítástechnikában shebangnak nevezik a #!
karakterpárt egy szkript elején. Más nevei sha-bang,[1][2] hashbang,[3][4] pound-bang,[5][6] vagy hash-pling.[7] Az elnevezésben a „bang” az időnként a felkiáltójelre is használt angol szó, a she-, sha- előtag az egyik leggyakoribb formájában a #!/bin/sh
-ban szereplő parancsértelmezőre, az sh-ra (Bourne shell) utal. Az egyéb elnevezésekben a „pound”, illetve „hash” a „#” jel angol neve.
Unix-szerű operációs rendszerekben (pl. Linuxban) – szemben a Windowszal – nem egy fájl kiterjesztése, hanem a fájlhoz rendelt végrehajtási jogosultság határozza meg, hogy az illető fájlt az operációs rendszer futtatható állománynak tekinti-e. Ez azonban nem elegendő, így futtatás előtt ellenőrizni kell a fájl típusát is annak meghatározásához, miként kell a fájlt futtatni (végrehajtani). Ez a fájl első néhány bájtjának alapján történik meg. Az operációs rendszer által értelmezhető parancsokat tartalmazó szöveges fájlok, az ún szkriptek is lehetnek végrehajthatóak, amennyiben azokat egy parancsértelmező (interpreter) program dolgozza fel. A Windowsban az ilyen fájloknak .bat kiterjesztése van. Unix-szerű operációs rendszerekben viszont ezt a szövegfájl első két bájtja dönti el. Ha egy szövegfájl első sorának első két karaktere #!
, amit az interpreter abszolút elérési útvonalának megadása követ, akkor az adott fájl értelmezéséhez az így megadott interpretert használja az operációs rendszer.[8] Például, ha egy szkript a következő sorral kezdődik: #!/bin/sh
, akkor a programbetöltő a /bin/sh interpretert használja. Linuxban ezt a viselkedést a kernel és a felhasználói kód együttműködése biztosítja.[9]
Az interpreterek a shebang sort általában figyelmen kívül hagyják, mert a #
karakter sok szkriptnyelvben megjegyzést jelöl, de azok a nyelvek, is, amelyekben nem a #
karakter jelöli a megjegyzéseket, ezt a sort rendszerint figyelmen kívül hagyhatják.[10]
Szintaxis
[szerkesztés]A shebang utasítássor formája a következő:[8]
#!parancsértelmező [ nem kötelező paraméter ]
ahol a parancsértelmező (más néven shell) egy futtatható program abszolút elérési útja.
A nem kötelező paraméter szóközöket és tabulátor karaktereket is tartalmazhat, és egyetlen paramétert reprezentál. A #!
után is lehet szóköz vagy tabulátor karakter, de ez nem szükséges, és nem is számít.
Linux alatt a parancsértelmező által megadott fájl akkor futtatható, ha rendelkezik végrehajtási joggal, és olyan kódot tartalmaz, amelyet a kernel vagy közvetlenül végrehajthat, ha létezik egy, a sysctl-en keresztül definiált csomagoló (ilyen csomagoló például a Microsoft .exe bináris fájlok futtatásához a wine), vagy ha maga is egy shebangot tartalmazó szkript. A shebangok és a csomagolók láncai egy közvetlenül futtatható fájlt hoznak létre, amely fordított sorrendben kapja meg az egyes parancsfájlokat paraméterként. Például, ha a /bin/A fájl egy futtatható programfájl, a /bin/B fájl pedig egy #!/bin/A paraméter
sorral kezdődő szövegfájl, hasonlóan a /bin/C fájlhoz, ami viszont #!/bin/B
-vel kezdődik, akkor a /bin/C fájl végrehajtása a /bin/B /bin/C
parancsra vált, ami végül a /bin/A paraméter /bin/B /bin/C
parancsot eredményezi. (Itt a betűközök a nem kötelező paramétert az interpretertől választják el, vagyis a #/!bin/C
sor ekvivalens a #!/bin/A paraméter /bin/B /bin/A
sorral.)
Solaris és Darwin alapú operációs rendszerekben (például macOS) az értelmező által megadott fájlnak a kernel által futtathatónak kell lennie, és önmagában nem lehet szkript.[11]
Példák
[szerkesztés]Néhány tipikus shebang sor:
#!/bin/sh
– a fájl végrehajtása a Bourne shell vagy egy kompatibilis shell használatával, amelyről feltesszük, hogy a /bin könyvtárban található#!/bin/bash
– a fájl végrehajtása a Bash (Bourne-again Shell) használatával#!/usr/bin/env python3
– végrehajtás Python-interpreter segítségével, a program keresési útvonalának használatával#!/bin/false
– ne tegyen semmit, de adjon vissza nullától eltérő kilépési állapotot, jelezve a hibát. Olyan parancsfájl önálló végrehajtásának megakadályozására szolgál, amelyet egy speciális kontextusban használunk. Ilyen például a.
parancs az sh/bash-ból,source
a csh/tcsh-ból, illetve a .profile, .cshrc vagy .login fájl.
Előnyei
[szerkesztés]Összehasonlítva a Windowsban szokásos, a fájlkiterjesztéseken alapuló program végrehajtási módot a Unix-szerű rendszerekben használt parancsértelmező alkalmazásokkal, az utóbbi lehetővé teszi a felhasználók számára, hogy globális, vagyis rendszerszinten nem ismert és rendszergazdai jogosultságok nélküli interpretereket használjanak. Ezzel fájlonként lehetséges a parancsértelmező-választás így akkor is használható, ha egy fájlkiterjesztés egynél több fájltípusra vonatkozik. Azt is lehetővé teszi, hogy a szkript végrehajtási nyelvét megváltoztassuk anélkül, hogy azok meghívási szintaxisát máshol módosítanunk kellene. A szkriptet végrehajtató programoknak nem kell tudniuk, hogy mi a szkript nyelve, mivel maga a szkript felelős a parancsértelmező kiválasztásáért.
Jegyzetek
[szerkesztés]- ↑ Advanced Bash Scripting Guide: Chapter 2. Starting Off With a Sha-Bang. [2019. december 10-i dátummal az eredetiből archiválva]. (Hozzáférés: 2019. december 10.)
- ↑ Cooper, Mendel. Advanced Bash Scripting Guide 5.3 Volume 1. lulu.com, 5. o. (2010. november 5.). ISBN 978-1-4357-5218-4
- ↑ MacDonald, Matthew. HTML5: The Missing Manual. Sebastopol, California: O'Reilly Media, 373. o. (2011). ISBN 978-1-4493-0239-9
- ↑ Lutz, Mark. Learning Python, 4th, O'Reilly Media, 48. o. (2009. szeptember 1.). ISBN 978-0-596-15806-4
- ↑ Guelich, Gundavaram and Birznieks, Scott, Shishir and Gunther. CGI Programming with PERL, 2nd, O'Reilly Media, 358. o. (2000. július 29.). ISBN 978-1-56592-419-2
- ↑ Lie Hetland, Magnus. Beginning Python: From Novice to Professional. Apress, 21. o. (2005. október 4.). ISBN 978-1-59059-519-0
- ↑ Schitka, John. Linux+ Guide to Linux Certification. Course Technology, 353. o. (2002. december 24.). ISBN 978-0-619-13004-6
- ↑ a b execve(2) - Linux man page. (Hozzáférés: 2010. október 21.)
- ↑ Corbet: The case of the supersized shebang. LWN.net
- ↑ SRFI 22
- ↑ https://stackoverflow.com/questions/45444823/python3-shebang-line-not-working-as-expected
Fordítás
[szerkesztés]Ez a szócikk részben vagy egészben a Shebang (Unix) című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.