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.