GNU/Linux >> Linux Esercitazione >  >> Linux

Perché è necessario inserire #!/bin/bash all'inizio di un file di script?

È una convenzione in modo che la shell *nix sappia che tipo di interprete eseguire.

Ad esempio, versioni precedenti di ATT erano impostate per impostazione predefinita su sh (la shell Bourne), mentre le versioni precedenti di BSD avevano come impostazione predefinita csh (la shell C).

Ancora oggi (dove la maggior parte dei sistemi esegue bash, la "Bourne Again Shell" ), gli script possono essere in bash, python, perl, ruby, PHP, ecc. ecc. Ad esempio, potresti vedere #!/bin/perl o #!/bin/perl5 .

PS:Il punto esclamativo (! ) è chiamato affettuosamente "bang" . Il simbolo del commento della shell (# ) è talvolta chiamato "hash" .

PPS:Ricorda:sotto *nix, associare un suffisso a un tipo di file è solo una convenzione , non una "regola" . Un eseguibile può essere un programma binario, uno qualsiasi dei milioni di tipi di script e anche altre cose. Da qui la necessità di #!/bin/bash .


Per essere più precisi lo shebang #! , quando sono i primi due byte di un eseguibile (x mode), viene interpretato dalla chiamata di sistema execve(2) (che esegue i programmi). Ma la specifica POSIX per execve non menzionare lo shebang.

Deve essere seguito da un percorso file di un eseguibile dell'interprete (che a proposito potrebbe anche essere relativo, ma molto spesso è assoluto).

Un bel trucco (o forse meno carino) per trovare un interprete (es. python ) nel $PATH dell'utente è usare il env program (sempre in /usr/bin/env su tutti i Linux) come ad es.

 #!/usr/bin/env python

Qualsiasi eseguibile ELF può essere un interprete. Potresti anche usare #!/bin/cat o #!/bin/true se lo volessi! (ma spesso sarebbe inutile)


Si chiama shebang. In unix-speak, # è chiamato sharp (come nella musica) o hash (come gli hashtag su Twitter), e ! si chiama botto. (Puoi effettivamente fare riferimento al tuo precedente comando di shell con !!, chiamato bang-bang). Quindi, una volta messi insieme, ottieni hasH-BANG, o shebang.

La parte dopo il #! dice a Unix quale programma usare per eseguirlo. Se non è specificato, proverà con bash (o sh, o zsh, o qualunque sia la tua variabile $SHELL) ma se è lì userà quel programma. Inoltre, # è un commento nella maggior parte delle lingue, quindi la riga viene ignorata nella successiva esecuzione.


Linux
  1. Perché una variabile è visibile in una subshell?

  2. Come controllare la sottostringa in Shell Script Bash?

  3. Perché /bin/sh punta a /bin/dash e non a /bin/bash??

  4. Come faccio a conoscere il nome del file di script in uno script Bash?

  5. Come includere un file in uno script di shell bash

Script Bash per rimuovere il file più vecchio da una cartella?

Perché nessuno usa la vera shell Bourne come /bin/sh?

Qual è il motivo per cui uno Shebang punta a /bin/sh piuttosto che a /bin/bash?

Esegui il comando bash sulla pipeline jenkins

Quali dimensioni dovresti assegnare a /, /boot, /home e swap

chroot fallisce - impossibile eseguire il comando `/bin/bash':File o directory non presenti