Shabang

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

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.

Caracterele secvenței „shabang” (numită și „hashbang”)

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ă

  1. ^ (RO) Andries Brouwer, #! linie , în #! - adevărul Unix din câte știu eu . Adus 24/05/2008 .

Elemente conexe

Alte proiecte

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT