Shebang ( engleză shebang , sha-bang , [1] [2] [3] hashbang , [4] [5] pound-bang , [2] [6] sau hash-pling [2] [7] ) - în programare , o secvență de semne hash și un semn de exclamare (" #! ") la începutul unui fișier script .
Când un script cu un shebang este rulat ca program pe sisteme de operare asemănătoare Unix , încărcătorul de programe tratează restul liniei după shebang ca numele de fișier al programului de interpret . Încărcătorul rulează acest program și îi transmite numele fișierului script cu shebang ca parametru. [8] De exemplu, dacă numele complet al fișierului script este „ path/to/script” și prima linie a acestui fișier este:
#!/bin/shapoi bootloader-ul va rula „ /bin/sh” (de obicei un shell Bourne sau un interpret de linie de comandă compatibil) și va trece „ path/to/script” ca prim parametru.
Linia shebang este de obicei omisă de către interpret, deoarece caracterul „#” este caracterul de început pentru comentarii în multe limbaje de scripting. Unii interpreți care nu folosesc caracterul hash pentru a marca începutul comentariilor (cum ar fi Scheme ) pot omite linia shebang, definindu-i scopul. [9] Alte soluții se bazează pe un preprocesor care procesează și elimină linia shebang înainte ca restul scriptului să fie transmis compilatorului sau interpretului. Deci, de exemplu, funcționează InstantFPC , ceea ce vă permite să rulați programe scrise în Free Pascal ca scripturi pe unele sisteme de operare. [zece]
Șirul shebang are următorul format: [8]
#! interpret [ optional-arg ]interpreterul trebuie să fie o cale absolută către un fișier de program executabil [1] (dacă interpretul este un script, trebuie să înceapă și cu un shebang). Opțional -arg- ul opțional trebuie să fie în format un singur argument (din motive de portabilitate, nu trebuie să conțină spații). Spațiu după #! este optional. [2]
Câteva replici tipice shebang:
Liniile Shebang pot conține argumente suplimentare care sunt transmise interpretului (vezi exemplul Perl de mai sus). Cu toate acestea, deoarece manipularea argumentelor poate varia, pentru portabilitate, cel mai bine este să folosiți un singur argument fără spații în interior. Îndrumări suplimentare privind portabilitatea sunt prezentate mai jos.
Specificarea unui interpret pe linia shebang permite utilizarea fișierelor de script și de date ca comenzi de sistem, ascunzând detaliile de implementare de utilizatori și alte programe, eliminând necesitatea de a specifica fișierul de interpret pe linia de comandă înainte de fișierul de script.
Să presupunem că scriptul shell Bourne se află în fișierul „ some/path/to/foo ”, a cărui primă linie este
#!/bin/sh -xDacă utilizatorul încearcă să execute acest fișier script folosind linia de comandă (specificând „bar” și „baz” ca argumente)
some/path/to/foo bar bazatunci rezultatul va fi același cu rularea comenzii:
/bin/sh -x some/path/to/foo bar bazDacă calea „ /bin/sh ” este un program Bourne shell , atunci „bar” și „baz” vor fi alocate parametrilor de poziție ai $1shell -ului $2și toate liniile fișierului „ some/path/to/foo ” vor fi fi executat ca comenzi ale acestui shell. De asemenea, deoarece caracterul pound este caracterul de început al comentariului în shell-ul Bourne (și în multe alte shell-uri), linia shebang va fi omisă.
Cu toate acestea, este la latitudinea interpretului însuși să determine procesarea finală a șirului shebang. Deci, un script care conține următoarele două linii ar imprima pur și simplu ambele linii la ieșirea standard :
#!/bin/cat Salut Lume!În comparație cu utilizarea mapării globale a unei extensii de fișier la o aplicație de interpret, specificarea unui șir de invocare a interpretului într-un shebang vă permite să specificați un interpret care nu este cunoscut la nivel global și nu necesită privilegii de administrator de sistem. Shebang vă permite, de asemenea, să specificați un interpret individual pentru un fișier, fără a introduce conceptul complicat de spațiu de nume pentru a mapa o singură extensie la mai mulți interpreți.
Shebang-ul trebuie să ofere o cale absolută (sau o cale relativă la directorul de lucru curent) pentru fișierele executabile. Acest lucru poate duce la probleme pentru sistemele cu o structură de sistem de fișiere non-standard. Chiar și pe sistemele cu directoare destul de standard, este posibil ca variantele aceluiași sistem de operare să stocheze interpretul dorit în locuri diferite. Python , de exemplu, ar putea fi în /usr/bin/python , /usr/local/bin/python , sau chiar /home/ nume de utilizator /bin/python dacă a fost instalat de altcineva decât administratorul de sistem.
Prin urmare, pentru o portabilitate mai bună, se folosește /usr/bin/env, care are capacitatea de a căuta un program în PATH , de exemplu:
#!/usr/bin/env pythonÎn acest caz, oriunde se află interpretul Python, acesta va fi lansat.