GNU/Linux >> Linux Esercitazione >  >> Linux

Che cos'è Shebang negli script della shell di Linux?

Ti imbatterai spesso in script di shell che iniziano con:

#!/bin/bash

Questo #! è chiamato shebang o hashbang. Lo shebang gioca un ruolo importante nello scripting della shell, specialmente quando si tratta di diversi tipi di shell.

In questo tutorial imparerai:

  • Cos'è Shebang?
  • In che modo gioca un ruolo importante nello scripting della shell?

Cos'è shebang negli script di shell?

Lo shebang è la combinazione di # (cancelletto) e ! (punto esclamativo). Questa combinazione di caratteri ha un significato speciale quando viene utilizzata nella prima riga dello script. Viene utilizzato per specificare l'interprete con cui verrà eseguito lo script specificato per impostazione predefinita.

Quindi, se la prima riga di uno script è:

#!/bin/bash

Significa che l'interprete dovrebbe essere bash shell. Se la prima riga è:

#!/bin/zsh

Significa che l'interprete da usare è Z shell.

Il #! è sicuramente speciale perché # è usato per i commenti negli script di shell ma qui ha un significato speciale.

Perché lo shebang è importante nello scripting della shell?

Ecco la cosa. Lo shebang seguito dall'eseguibile della shell non è obbligatorio per uno script.

Se scrivi un semplice script come questo:

echo "Namaste, folks!"

E dagli il permesso di esecuzione ed eseguilo con il . operatore, verrà eseguito dalla shell di accesso.

[email protected]:~$ cat sample 
echo "Namaste, folks!"
[email protected]:~$ chmod u+x sample 
[email protected]:~$ ./sample 
Namaste, folks!

Allora perché gli script di shell includono la riga #!/bin/bash all'inizio dello script?

Perché ci sono diverse shell disponibili per i sistemi Linux e UNIX. Sebbene queste shell abbiano una sintassi per lo più comune, hanno una sintassi diversa o un modo diverso di gestire le cose.

Questo è il motivo per cui diventa importante specificare l'interprete di shell corretto nello script, altrimenti alcuni script potrebbero produrre risultati diversi se eseguiti in shell diverse.

Lascia che te lo mostri con un semplice esempio.

Importanza di specificare l'interprete di shell con shebang

Ho scritto uno script di shell di esempio con una serie di distribuzioni. Lo script visualizza quindi la distribuzione all'indice 2.

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Non ho aggiunto la riga shebang per specificare alcun interprete di shell. Ciò significa che quando eseguo questo script, verrà eseguito dalla shell predefinita (bash nel mio caso):

[email protected]:~$ echo $0
bash

Riesci a indovinare l'output dello script?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: SUSE

Mostra SUSE all'indice 2 perché l'indice dell'array inizia da 0 in Bash e in molti altri linguaggi di programmazione e scripting. MA non è il caso della shell Z. Nella shell Z, l'indice dell'array inizia da 1.

Ho la shell Z installata sul mio sistema. Cambio lo script e aggiungo la riga shebang per specificare che lo script dovrebbe essere eseguito da Z shell per impostazione predefinita.

#!/bin/zsh

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Riesci a indovinare l'output quando eseguo lo script ora?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: Fedora

Noti la differenza ora? È lo stesso copione ma l'aggiunta della linea shebang ha fatto la differenza.

Ed è per questo che è importante specificare l'interprete di shell corretto con l'operatore shebang. Come amministratore di sistema, potresti scrivere script di shell tenendo presente una shell specifica, che sia bash, ksh o zsh. Ma non puoi essere sicuro che il sistema che eseguirà lo script avrà la stessa shell predefinita della tua. Ora le cose hanno un senso, giusto?

Shebang viene ignorato se specifichi esplicitamente la shell

Perché sto sottolineando la shell "predefinita"? Perché shebang specifica l'interprete con cui eseguire lo script.

Puoi, tuttavia, specificare la shell in modo esplicito e in questi casi, la riga shebang verrà ignorata.

Come funziona esattamente lo shebang?

Quando usi shebang nella prima riga di uno script, stai dicendo alla shell di eseguire lo script specificato con il comando specificato.

Fondamentalmente, #!/bin/zsh equivale a:

/bin/zsh script_name

Ti ho detto che se la prima riga di uno script inizia con shebang, significa che stai specificando l'interprete della shell.

Questo è vero solo in parte. In realtà, questo è lo scopo del personaggio Shebang. Ma non è necessario che la linea shebang abbia l'eseguibile di una shell. Può essere qualsiasi cosa.

Ad esempio, sostituirò #!/bin/zsh con #!/bin/cat . /bin/cat è l'eseguibile del comando cat.

#!/bin/cat

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Ciò significa che ora questo script verrà eseguito con cat comando e visualizzare il contenuto dello script.

Funzionerà fintanto che punta a un comando eseguibile. Se metti qualcosa a caso, verrà generato un errore.

Cambio la linea shebang in:

#!/home/abhishek

Chiaramente, non punta all'eseguibile di nessun comando e quindi genera un errore di interprete errato.

[email protected]:~$ cat arrays.sh 
#!/home/abhishek

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
[email protected]:~$ ./arrays.sh 
bash: ./arrays.sh: /home/abhishek: bad interpreter: Permission denied

Conclusione

Permettetemi di rispondere ad alcune altre domande prima di concludere questo articolo:

  • È importante che non ci sia spazio tra # e ! . NON PUOI usarlo in questo modo:# !/bin/bash .
  • La maggior parte dei sistemi consente uno spazio tra #! e /bin/bash tuttavia è buona norma evitare lo spazio tra #! e /bin/bash .
  • #! deve essere sulla prima riga, altrimenti la riga shebang verrà trattata come commento. Non puoi nemmeno avere una riga vuota prima.

Spero che tu abbia una migliore comprensione del perché #! è usato all'inizio degli script di shell in Linux. Sentiti libero di lasciare un commento se hai domande o suggerimenti.


Linux
  1. 4 modi per eseguire uno script di shell in UNIX / Linux

  2. Cosa sono gli script di shell? Come creare script di shell?

  3. Esegui uno script reindirizzato da stdin (Linux/Shell Scripting)

  4. Script di traslitterazione per shell linux

  5. Creazione di modelli con Linux in uno script Shell?

Che cos'è la shell in Linux?

Come memorizzare un comando Linux come variabile nello script della shell

Come eseguire lo script della shell come servizio SystemD in Linux

Stampa il tempo di esecuzione dello script della shell in Linux

Che cos'è Subshell in Linux?

Che cos'è Login Shell in Linux?