web-dev-qa-db-fra.com

Ce qui interprète Shell exécute un script sans tralala?

Supposons que la coque par défaut de mon compte soit ZSH, mais j'ai ouvert le terminal et tiré de bash et exécuté un script nommé prac002.sh, quel interprète shell serait utilisé pour exécuter le script, le zsh ou la bash? Considérez l'exemple suivant:

papagolf@Sierra ~/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

papagolf@Sierra ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' Prompt in zsh changes to '$' Prompt, indicating bash.)

papagolf@Sierra:~/My Files/My Programs/Learning/Shell$ ./prac002.sh 
Enter username : Rex
Rex
# Which interpreter did it just use?

** Edit: ** Voici le contenu du script

papagolf@Sierra ~/My Files/My Programs/Learning/Shell % cat ./prac002.sh 
read -p "Enter username : " uname
echo $uname
20
7_R3X

Parce que le script ne commence pas par un #! Ligne shebang indiquant quel interprète à utiliser, POSIX dit que :=:

Si la fonction execl() La fonction échoue en raison d'une erreur équivalente à l'erreur [ENOEXEC] définie dans le volume des interfaces système de POSIX.1-2008, La coquille doit exécuter une commande équivalente à un shell invoquée avec le chemin de chemin résultant de la recherche comme son premier opérande , avec tout argument restant transmis à la nouvelle coquille, sauf que la valeur de " 0 $ "Dans la nouvelle shell peut être réglé sur le nom de la commande. Si le fichier exécutable n'est pas un fichier texte, le shell peut contourner cette exécution de la commande. Dans ce cas, il doit écrire un message d'erreur et retourne un statut de sortie de 126.

Ce phrasé est un peu ambigu et différents coquilles ont des interprétations différentes.

Dans ce cas, bash exécutera le script en utilisant elle-même . D'autre part, si vous le faites de zsh à la place, ZSH utiliserait sh (tout ce qui est sur votre système).

Vous pouvez vérifier ce comportement pour ce cas en ajoutant ces lignes au script:

echo $BASH_VERSION
echo $ZSH_VERSION

Vous noterez que, de Bash, la première ligne génère votre version, tandis que la seconde n'a jamais dit quoi que ce soit, quel que soit votre shell que vous utilisez.

  • Si votre /bin/sh Est, dites, dash, alors aucune ligne ne produira quoi que ce soit lorsque le script est exécuté de ZSH ou de DASH.
  • Si votre /bin/sh Est un lien pour bash, vous verrez la sortie de première ligne dans tous les cas.
  • Si /bin/sh Est un version différente de bash que vous utilisiez directement, vous verrez une sortie différente lorsque vous exécutez le script de Bash directement et de ZSH.

La commande ps -p $$ De la réponse de Rools montrera également des informations utiles sur la commande utilisée par la coque utilisée pour exécuter le script.

21
Michael Homer

Quand vous n'avez pas de #! (appelé shebang) ligne, SH est utilisé. Pour vérifier cela, vous pouvez exécuter le script suivant.

ps -p $$
echo -n "The real Shell is: "
realpath /proc/$$/exe

Sur mon ordinateur je reçois

  PID TTY          TIME CMD
13718 pts/16   00:00:00 sh
The real Shell is: /usr/bin/bash

même si ma coque par défaut est ZSH. Il utilise Bash depuis sur ma machine, la commande sh est mise en œuvre par Bash.

3
rools