GNU/Linux >> Linux Esercitazione >  >> Linux

Quale interprete di shell esegue uno script senza Shebang?

Supponiamo che la shell predefinita per il mio account sia zsh ma ho aperto il terminale e avviato bash ed eseguito uno script chiamato prac002.sh , quale interprete di shell verrebbe utilizzato per eseguire lo script, zsh o bash? Considera il seguente esempio:

[email protected] ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf
[sudo] password for papagolf: 
papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh
# papagolf's default shell is zsh

[email protected] ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.)

[email protected]:~/My Files/My Programs/Learning/Shell$ ./prac002.sh 
Enter username : Rex
Rex
# Which interpreter did it just use?

**EDIT:** Ecco il contenuto dello script

[email protected] ~/My Files/My Programs/Learning/Shell % cat ./prac002.sh 
read -p "Enter username : " uname
echo $uname

Risposta accettata:

Perché lo script non inizia con un #! riga shebang che indica quale interprete usare, POSIX dice che:

Se il execl() funzione non riesce a causa di un errore equivalente all'errore [ENOEXEC] definito nel volume System Interfaces di POSIX.1-2008, la shell eseguirà un comando equivalente a far invocare una shell con il percorso risultante dalla ricerca come suo primo operando , con tutti gli argomenti rimanenti passati alla nuova shell, tranne per il fatto che il valore di "$0" nella nuova shell può essere impostato sul nome del comando. Se il file eseguibile non è un file di testo, la shell potrebbe ignorare l'esecuzione di questo comando. In questo caso, scriverà un messaggio di errore e restituirà uno stato di uscita di 126.

Quel fraseggio è un po' ambiguo e shell differenti hanno interpretazioni differenti.

In questo caso, Bash eseguirà lo script utilizzando se stesso . D'altra parte, se invece lo eseguissi da zsh, zsh userebbe sh (qualunque cosa sia sul tuo sistema).

Puoi verificare quel comportamento per questo caso aggiungendo queste righe allo script:

echo $BASH_VERSION
echo $ZSH_VERSION

Noterai che, da Bash, la prima riga restituisce la tua versione, mentre la seconda non dice mai nulla, indipendentemente dalla shell che usi.

  • Se il tuo /bin/sh è, diciamo, dash , quindi nessuna riga produrrà nulla quando lo script viene eseguito da zsh o dash.
  • Se il tuo /bin/sh è un collegamento a Bash, vedrai l'output della prima riga in tutti i casi.
  • Se /bin/sh è una versione diversa di Bash rispetto a quello che stavi usando direttamente, vedrai un output diverso quando esegui lo script da bash direttamente e da zsh.
Correlati:scorrere i file con spazi nei nomi??

Il ps -p $$ comando dalla risposta di rools mostrerà anche informazioni utili sul comando utilizzato dalla shell per eseguire lo script.


Linux
  1. Script Bash:pessimo interprete

  2. È possibile far interagire uno script di shell bash con un altro programma a riga di comando?

  3. basename con spazi in uno script bash?

  4. Directory di modifica dello script Shell con variabile

  5. Come aggiungere shebang #! con script php su Linux?

Automatizza l'elaborazione delle immagini con questo script Bash

Come scrivere uno script Bash con esempi

Bash Shebang

Shell Scripting Parte I:Introduzione agli script bash

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

Bash Scripting Introduzione Tutorial con 5 esempi pratici