Cosa significa la riga "#! / Bin / sh" in uno script shell UNIX?


142

Stavo seguendo alcuni tutorial di script di shell e ho trovato il seguente programma di esempio:

#!/bin/sh
clear
echo "HELLO WORLD"

Qualcuno può dirmi qual è il significato del commento #!/bin/shall'inizio?



2
Buona spiegazione su askubuntu: askubuntu.com/questions/141928/…
fkoessler


Risposte:


143

Si chiama shebang e dice alla shell genitore quale interprete dovrebbe essere usato per eseguire lo script.

per esempio

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

È implementato come un commento in modo che tutto ciò che entra in quella riga non sia "rilevante" per l'interprete specificato. ad esempio, tutti i linguaggi di scripting tendono a capire che una riga che inizia con #è un commento e ignorerà la !/usr/bin/whateverparte, che altrimenti potrebbe essere un errore di sintassi in quel particolare linguaggio.


6
Di solito è il kernel, non la shell, che elabora questo. La shell chiama semplicemente la exec()chiamata di sistema sul file.
triplo il

47

Quando si tenta di eseguire un programma in unix (uno con il bit eseguibile impostato), il sistema operativo esaminerà i primi byte del file. Questi formano il cosiddetto "numero magico", che può essere utilizzato per decidere il formato del programma e come eseguirlo.

#!corrisponde al numero magico 0x2321 (cercalo in una tabella ASCII). Quando il sistema vede quel numero magico, sa che ha a che fare con uno script di testo e legge fino al prossimo \n(c'è un limite, ma mi sfugge atm). Dopo aver identificato l'interprete (il primo argomento dopo lo shebang) chiamerà l'interprete.

Altri file hanno anche numeri magici. Prova a guardare un file bitmap (.BMP) tramite lesse vedrai che sono i primi due caratteri BM. Questo numero magico indica che il file è effettivamente una bitmap.


10

Se il file in cui risiede questo script è eseguibile, l'hash-bang ( #!) indica al sistema operativo quale interprete utilizzare per eseguire lo script. In questo caso è /bin/sh, per esempio.

C'è un articolo di Wikipedia a riguardo per ulteriori informazioni.


5

La prima riga dice alla shell che se si esegue direttamente lo script (./run.sh; al contrario di / bin / sh run.sh), dovrebbe usare quel programma (/ bin / sh in questo caso) per interpretarlo.

Puoi anche usarlo per passare argomenti, comunemente -e (esci da errore), o usare altri programmi (/ bin / awk, / usr / bin / perl, ecc.).


-4

#!/bin/sho #!/bin/bashdeve essere la prima riga dello script perché se non lo si utilizza nella prima riga, il sistema tratterà tutti i comandi in quello script come comandi diversi. Se la prima riga è #!/bin/sh, considererà tutti i comandi come uno script e mostrerà che questo file è in esecuzione nel pscomando e non i comandi all'interno del file.

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo

1
Stack Overflow non è Twitter. Per favore, prenditi il ​​tempo necessario per scrivere parole come "u" e "1st". Stai aiutando a scrivere un libro di consultazione, quindi la grammatica e l'ortografia corrette sono significative. Inoltre, prestare attenzione alla corretta formattazione. I comandi che verrebbero emessi dalla riga di comando, come ps, e gli estratti di codice come #!/bin/shdovrebbero essere formattati.
Tin Man,

Ho provato a ripulire l'inglese qui, ma non sono ancora sicuro di cosa significhi. Immagino che la risposta cerchi di dire che i comandi nello script verranno eseguiti come comandi distinti e l'aggiunta di uno shebang mostrerà lo script come singolo comando in un elenco di processi. Questo non è in realtà vero.
Tripleee
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.