Shabang
Un shabang ( de asemenea , numit shebang, hashbang, hashpling, sau lira bang), în Unix si Unix- ului de #!
operare sisteme , este o secvență de caractere care încep cu „ #!
“ Plasate exact la începutul unui scenariu , indicând sistemul care interpret de utilizat pentru a executa scriptul în sine.
Termenul derivă dintr-o contracție a SHArp bang sau haSH bang , care reprezintă numele utilizate în mod tradițional în mediile Unix pentru a se referi la cele două caractere în cauză. O altă teorie despre shabang's sh provine din textul standard shell , „ /bin/sh
”, care este de obicei interpretul specificat.
Istorie
Shabang-ul a fost introdus de Dennis Ritchie între versiunea 7 a Unix și versiunea 8 în Bell Labs. A fost apoi adăugată la BSD la Berkeley. Întrucât versiunea 8 și mai târziu nu au fost lansate publicului, prima lansare în masă a shabang-ului a avut loc chiar pe BSD.
Caracteristici
Mai precis, constă dintr-un număr magic (caracterul hash și punctul de exclamare „ #!
”), Urmat de calea absolută a interpretului care urmează să fie utilizată. Shabang-ul este utilizat astfel încât scriptul să arate și să funcționeze în ochii utilizatorului ca orice alt fișier executabil nativ al platformei.
Deoarece în limbile de scriptare caracterul „ #
” indică de obicei începutul unei linii de comentariu, interpretul va ignora conținutul liniei care conține shabang-ul în incipit; de fapt, linia există doar pentru a indica interpretul care este necesar și, conceptual, nu face parte din script .
Portabilitate
În timp ce mulți shabang indică interpreți care au nume de cale standard bine cunoscute, este de asemenea posibil ca între variantele aceluiași sistem de operare același interpret să fie indicat cu nume de cale diferite. În absența unei standardizări stricte a pozițiilor fiecărui interpret, pot apărea probleme datorită faptului că shabang poate necesita un interpret care nu există sau care nu se află în locul indicat. Aceasta limitează portabilitatea fișierului.
Din acest motiv, în tranziția de la computer la computer, este adesea necesară modificarea exactă a scriptului pentru a permite portabilitatea între diferite sisteme. Acesta este unul dintre motivele pentru care standardul POSIX nu include această caracteristică, care este totuși frecvent utilizată, în special la nivel educațional. Adesea comanda env poate fi utilizată pentru a rezolva problema.
O altă problemă de portabilitate este legată de gestionarea oricăror parametri specificați interpretului, deoarece unele sisteme au posibilități limitate în acest sens. De exemplu, pe sistemele bazate pe Linux , shabang-ul
#! / usr / bin / env perl -w
va rula ca /usr/bin/env "perl -w"
, cu "perl" și "-w" combinate într-un singur parametru la /usr/bin/env
și acest lucru provoacă o eroare:
/ usr / bin / env: perl -w: Nu există un astfel de fișier sau director
Alte sisteme se pot comporta în moduri diferite.
Shabang ca număr magic
Shabang este de fapt o versiune lizibilă a unui număr magic din fișierul executabil. Șirul magic devine secvența de octeți 0x23
0x21
la începutul fișierului, care corespunde exact reprezentării conform codificării ASCII a caracterelor " #!
".
Fișierele executabile care nu necesită interpreți au în schimb alte numere magice .
Exemple
Script Shell
Rulați folosind Bash :
#! / bin / bash
Rulează utilizând shell-ul /bin/sh
. Pe multe sisteme Unix și Unix, acesta este un shell POSIX (de exemplu, pe HP-UX , AIX și, de asemenea, pe GNU / Linux , unde Bash se comportă ca un shell POSIX atunci când este invocat cu acest nume), în timp ce peSolaris este în schimb un Bourne coajă :
#! / bin / sh
Rulează folosind Korn shell :
#! / bin / ksh
Rulează folosind csh, shell-ul C :
#! / bin / csh
Script Perl
Rulează utilizând Perl :
#! / usr / bin / perl
Se execută folosind Perl , dar presupune că interpretul Perl se află într-un alt director:
#! / usr / local / bin / perl
Script Python
Rulează folosind Python :
#! / usr / bin / python
Rulează utilizând versiunea Python 2.3:
#! / usr / bin / python2.3
Rulează folosind versiunea Python 2.4:
#! / usr / bin / python2.4
Rulează utilizând versiunea Python 2.5:
#! / usr / bin / python2.5
Scenariu rubin
Rulează folosind Ruby :
#! / usr / bin / ruby
Script Tcl
Rulați un script Tcl invocând interpretul prin /bin/sh
:
#! / bin / sh
# Această linie și următoarele sunt ignorate de tclsh, în timp ce shell-ul ignoră doar această linie \
exec tclsh " $ 0 " " $ @ "
Această metodă profită de o particularitate a limbajului Tcl: dacă o linie de comentariu se termină cu o bară inversă (" \
"), atunci comentariul continuă și pe linia următoare, în timp ce acest lucru nu este valabil pentru shell.
De fapt, scriptul este pornit pentru prima dată prin /bin/sh
, care ignoră linia de comentarii și continuă să execute comanda " exec tclsh "$0" "$@"
", care caută tclsh
în directoarele listate în mediu variabila $PATH
și o invocă trimițându- i calea scriptului și toți parametrii specificați, înlocuind-o cu procesul shell. În acest moment, interpretul Tcl începe să citească scriptul, ia în considerare toate cele trei rânduri ca un comentariu și apoi examinează următoarele rânduri.
Alte scripturi
Rulează utilizând interpretul Awk găsit în directorul /bin/
. Rețineți utilizarea opțiunii -f
, altfel scriptul ar fi tratat ca un fișier text de intrare care urmează să fie procesat (în loc de instrucțiunile AWK de executat):
#! / bin / awk -f
Efectuează folosind Lua :
#! / usr / bin / lua
Rulează utilizând interpretul PHP :
#! / usr / bin / php
Invocare cu parametri și opțiuni
În multe sisteme este posibil să se indice interpretului un parametru sau o opțiune, iar în unele dintre ele chiar mai mulți parametri și / sau opțiuni. Cu toate acestea, diferite implementări au comportamente și constrângeri diferite: de exemplu, în multe sisteme, inclusiv în cele bazate pe Linux , tot ce urmează interpretului este transmis ca un singur parametru chiar dacă conține spații, în timp ce pe alte sisteme există limitări ale lungimii totale a shabang-ul . [1]
Se execută utilizând interpretul AWK, iar opțiunea -f
este transmisă și:
#! / bin / awk -f
# Restul scriptului AWK
...
Se execută folosind interpretul Perl , iar opțiunea -w îi este transmisă și pentru a primi mesajele de avertizare:
#! / usr / bin / perl -w
#
# Restul scriptului Perl
...
Executați folosind bash , indicând cu opțiunea -x
pentru a afișa fiecare comandă imediat înainte de a o executa:
#! / bin / bash -x
#
# Restul scriptului Bash
...
Depanarea problemelor shabang folosind env
Invocarea prin env este utilă deoarece devine posibilă specificarea unui interpret care nu știe calea sa absolută . env
caută interpretul în directoarele specificate în $PATH
mediu $PATH
.
De exemplu, presupunând că nu știți exact unde este instalat interpretul Perl:
#! / usr / bin / env perl
#
# Restul scriptului Perl
...
Deși această metodă crește foarte mult portabilitatea, nu este infailibilă: în timp ce env este aproape întotdeauna disponibil în /usr/bin/env
, pe un număr limitat de platforme se găsește în /bin/env
. În acest caz, ca și în cazul indicării oricărei căi incompatibile cu setările generale ale sistemului de operare, interpretul de comandă (terminalul) returnează o eroare și nu execută scriptul.
De asemenea, pe sistemele care nu separă parametrii specificați după interpret (care în acest caz este /usr/bin/env
) devine imposibil să specificați parametrii interpretului real.
Alte exemple
Aceasta este o chine , adică un fișier care se produce prin comanda cat :
#! / bin / cat Orice text pe mai multe linii. ...
Acest script nu face altceva decât să scrie pe termen nelimitat numele cu care este invocat:
#! / usr / bin / yes Orice text (/ usr / bin / yes nu citește fișierele) ...
Acest script nu face altceva decât să se dezaboneze, folosind rm ca interpret:
#! / bin / rm Orice text (/ bin / rm nu citește fișierul, doar îl șterge) ...
Notă
Elemente conexe
Alte proiecte
- Wikimedia Commons conține imagini sau alte fișiere despre Shabang
linkuri externe
- ( EN ) Sven Mascheck, „#!” - magie, detalii despre mecanismul shebang pe diferite arome Unix , su in-ulm.de , 26-02-2008. Adus 24/05/2008 . (detalii despre mecanismul shabang pe diferite platforme)
- ( RO ) Andries Brouwer, #! - adevărul Unix din câte știu eu , pe homepages.cwi.nl , 05-12-2002. Adus 24-05-2008 . (detalii despre mecanismul shabang pe diferite platforme)
- (RO) shebang , pe foldoc.org. Adus 24/05/2008 . (articol din Dicționarul gratuit online de calcul )