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?
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?
Risposte:
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
!
viene spesso utilizzato in altri contesti per indicare un comando da eseguire. Ad esempio in vim
o 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.
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/foo
inizia con #!/bin/sh
, il kernel verrà eseguito /bin/sh /home/me/foo
).
Successivamente la shell ( bin/sh
o 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.
Deve essere un commento perché solo in questo modo funzionerà anche per eseguire uno script come "interpretername scriptname". Non conosco l'origine del "!".
#!
(almeno quanto ricorda dmr ...), inclusa una spiegazione del perché#
(sì, la linea doveva essere ignorata dalle shell esistenti).