it-swarm.it

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

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

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

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

132
Jake

Si chiama Shebang e dice alla shell madre 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. per esempio. tutti i linguaggi di scripting tendono a capire che una riga che inizia con # è un commento e ignorerà la parte !/usr/bin/whatever, che altrimenti potrebbe essere un errore di sintassi in quella particolare lingua.

132
Marc B

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 less e vedrai che i primi due caratteri sono BM. Questo numero magico indica che il file è effettivamente una bitmap.

43
Foo Bah

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, ad esempio, è /bin/sh.

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

8
Kusalananda

La prima riga dice a 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.).

5
Kevin