Szerkesztő:Afalco54/Shebang (UNIX)
A számítástechnikában shebang-nak 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 utal. Az egyéb elnevezésekben a "pound", illetve "hash" a "#" jel angol neve.
Unix-szerű, operációs rendszerekben, (pl. Linux-ban) - szemben a Windows-zal - 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 futtattható á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. Windows-ban 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ás sor 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 betűközöket és tabulátor karaktereket is tartalmazhat és egyetlen paramétert reprezentál. A #! után is lehet betű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, vagy, 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), illetve 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 file /bin/A
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
' fájlra vált, ami végül a /bin/A paraméter /bin/B /bin/C
fájlra vált . (Itt a betűközök a nem kötelező paramétert választják el az parancsértelmezőtől, 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
- Futtassa a fájlt 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 Windows-ban 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 parancsértelmezőket 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.
Hivatkozások (angol nyelven)
[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