Perché la "she-bang" inizia con un "#!"?


10

Perché lo "scoppio" inizia con un #!, come #!/bin/bash? Ho sempre accettato che così sia, ma c'è un motivo dietro?

Perché iniziare con #; di solito non è un commento? O è il punto che dovrebbe essere un commento?


4
Wikipedia ha una storia abbastanza dettagliata di #!(almeno quanto ricorda dmr ...), inclusa una spiegazione del perché #(sì, la linea doveva essere ignorata dalle shell esistenti).
Gilles 'SO- smetti di essere malvagio' il

Mancato controllo wikipedia :)
Johan

1
Vorrei solo che le conchiglie fossero abbastanza intelligenti da rimuovere un CR / LF estraneo se è lì ...;)
Aaron D. Marasco

Risposte:


16

Tipicamente shebang si riferisce solo al #!(in !genere si chiama "bang", e sembra che "lei" sia una corruzione di "SHArp" o "haSH" per #) - l'intera linea è chiamata una linea di shebang

Comincia intenzionalmente con un carattere di commento per la retrocompatibilità con cose che non sanno come gestirlo; l' !è presumibilmente solo per distinguerlo da un commento casuale di avviare il file, in modo un file che inizia con # this is my script!non tenta di eseguire l' this is my script!interprete


2
Il botto !viene spesso utilizzato in altri contesti per indicare un comando da eseguire. Ad esempio in vimo altri programmi con le proprie linee di comando, bang è spesso il carattere di escape che li fa eseguire il comando in una shell di sistema anziché nella loro interfaccia interna.
Caleb,

4

Per capirlo devi capire che la prima riga dello script viene effettivamente letta due volte , da 2 programmi diversi. La prima volta, il kernel apre il file e cerca quella sequenza di caratteri ( #!) sulla prima riga. Se lo trova, esegue il programma di shell che è indicato lì, passando il nome del file come parametro. (es. se il file /home/me/fooinizia con #!/bin/sh, il kernel verrà eseguito /bin/sh /home/me/foo).

Successivamente la shell ( bin/sho qualunque sia il programma dell'interprete specificato) legge il file. La shell non sa nulla delle linee shebang ma leggerà comunque la prima riga perché è proprio come qualsiasi altra riga nel file ... le legge tutte. Non vuoi che la shell si blocchi o modifichi il suo comportamento in alcun modo ... il modo per farlo è farla trattare come un commento e ignorarlo. Pertanto, il carattere migliore per un'istruzione del kernel con cui iniziare sarebbe il carattere di commento.


È davvero il kernel che lo fa, sembra che sia la shell corrente in cui lavori che analizzerà lo shebang e poi spingerà la sceneggiatura
Johan

No ... è il kernel stesso, dal vivo e di persona. Funzionerà anche se non stai usando una shell per eseguire lo script ... ci sono altri modi per eseguire un file oltre a una shell ... per esempio da un programma C, usando la chiamata di sistema "exec"
JoelFan

en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" in ascii sono i byte 0x23 0x21 - quando exec () vede questi byte il comportamento è di trattare il resto della linea come un percorso per un interprete.
Aaron McMillin,

1

Deve essere un commento perché solo in questo modo funzionerà anche per eseguire uno script come "interpretername scriptname". Non conosco l'origine del "!".


1
Anche se hai appena eseguito ./scriptname, l'interprete vede ancora la linea del bang, quindi deve comunque essere un commento.
psusi,

1
O per essere più dettagliati: lo shebang: '#!' è progettato per non essere visto dall'interprete, quindi deve iniziare con il commento char '#'. Invece, viene "visto" (e interpretato) dal set di chiamate di sistema "exec [lv] *" del kernel.
arielf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.