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.
Il ps -p $$
comando dalla risposta di rools mostrerà anche informazioni utili sul comando utilizzato dalla shell per eseguire lo script.