Shebang (UNIX)

A Wikipédiából, a szabad enciklopédiából

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]

  1. 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.)
  2. Cooper, Mendel. Advanced Bash Scripting Guide 5.3 Volume 1. lulu.com, 5. o. (2010. november 5.). ISBN 978-1-4357-5218-4 
  3. MacDonald, Matthew. HTML5: The Missing Manual. Sebastopol, California: O'Reilly Media, 373. o. (2011). ISBN 978-1-4493-0239-9 
  4. Lutz, Mark. Learning Python, 4th, O'Reilly Media, 48. o. (2009. szeptember 1.). ISBN 978-0-596-15806-4 
  5. 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 
  6. Lie Hetland, Magnus. Beginning Python: From Novice to Professional. Apress, 21. o. (2005. október 4.). ISBN 978-1-59059-519-0 
  7. Schitka, John. Linux+ Guide to Linux Certification. Course Technology, 353. o. (2002. december 24.). ISBN 978-0-619-13004-6 
  8. a b execve(2) - Linux man page. (Hozzáférés: 2010. október 21.)
  9. Corbet: The case of the supersized shebang. LWN.net
  10. SRFI 22
  11. 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.