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/sh
all'inizio?
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/sh
all'inizio?
Risposte:
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/whatever
parte, che altrimenti potrebbe essere un errore di sintassi in quel particolare linguaggio.
exec()
chiamata di sistema sul file.
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 sono i primi due caratteri BM
. Questo numero magico indica che il file è effettivamente una bitmap.
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.
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.).
#!/bin/sh
o #!/bin/bash
deve 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 ps
comando 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
ps
, e gli estratti di codice come #!/bin/sh
dovrebbero essere formattati.