Che cosa significa la riga “#! / Bin / sh” in uno script di shell UNIX?

Stavo seguendo alcune esercitazioni di script di shell e ho trovato il seguente programma di esempio:

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

Qualcuno può dirmi qual è il significato di menzionare ‘ !/bin/sh ‘ nel commento?

Si chiama shebang e dice alla shell padre 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 linea non sia "rilevante" per l'interprete specificato. ad esempio, tutti i linguaggi di scripting tendono a comprendere che una riga che inizia con # è un commento e ignorerà la parte !/usr/bin/whatever , che potrebbe altrimenti essere un errore di syntax in quel particolare linguaggio.

Quando si tenta di eseguire un programma in unix (uno con il set di bit eseguibile), il sistema operativo esaminerà i primi 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 (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). Avendo identificato l’interprete (il primo argomento dopo lo shebang) chiamerà l’interprete.

Anche altri file hanno 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.

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

C’è un articolo su Wikipedia per maggiori informazioni.

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

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

#!/bin/sh o #!/bin/bash deve essere la prima riga dello script perché se non lo si usa 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 un unico 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