2011-09-09 14 views
109

stavo attraversando alcuni tutorial script di shell e trovato il seguente programma di esempio:Che cosa significa la riga "#!/Bin/sh" in uno script di shell UNIX?

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

Qualcuno può informi qual è il significato della menzione '!/bin/sh' nel commento?

+1

[Shebang] (http://en.wikipedia.org/wiki/Shebang_%28Unix%29) – drootang

+1

buona spiegazione su Ask Ubuntu: http://askubuntu.com/questions/141928/what-is- difference-between-bin-sh-and-bin-bash –

+1

Possibile duplicato di [Perché è necessario inserire #!/bin/bash all'inizio di un file di script?] (http://stackoverflow.com/questions/8967902/why-do-you-need-to-put-bin-bash-at-the-beginning-of-a-script-file) –

risposta

110

Si chiama shebang, e racconta la shell genitore che interprete deve essere utilizzato per eseguire lo script.

ad es.

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

+3

Di solito è il kernel, non la shell, che lo elabora. La shell chiama semplicemente la chiamata di sistema 'exec()' sul file. – tripleee

7

Se il file in cui è presente 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 Wikipedia article su di esso per ulteriori informazioni.

5

La prima riga indica alla shell che se si esegue direttamente lo script (./run.sh; in opposizione a/bin/sh run.sh), dovrebbe utilizzare tale programma (/ bin/sh in questo caso) interpretarlo.

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

41

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

#! corrisponde al numero magico 0x2321 (cercare in un tavolo ascii). Quando il sistema vede quel numero magico, sa che si tratta di uno script di testo e legge fino al prossimo \n (c'è un limite, ma mi sfugge atm). Avendo 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 less e vedrai che i primi due caratteri sono BM. Questo numero magico indica che il file è effettivamente un bitmap.

-3

#!/bin/sh o #!/bin/bash deve essere la prima riga dello script perché se non lo si utilizza sulla 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 comando ps 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 di pronunciare effettivamente parole come "u" e "1st". Stai aiutando a scrivere un libro di riferimento in modo che la grammatica e l'ortografia siano appropriate. Inoltre, prestare attenzione alla corretta formattazione. I comandi che verrebbero emessi dalla riga di comando, come 'ps', e gli estratti di codice come' #!/Bin/sh' dovrebbero essere formattati. –

+0

Ho provato a ripulire l'inglese qui, ma non sono ancora sicuro di cosa significhi. Immagino che la risposta provi a dire che i comandi nello script saranno eseguiti come comandi distinti e l'aggiunta di uno shebang mostrerà lo script come un singolo comando in un elenco di processi. Questo non è in realtà vero. – tripleee

Problemi correlati