GNU/Linux >> Tutoriels Linux >  >> Linux

Quel interpréteur Shell exécute un script sans Shebang ?

Supposons que le shell par défaut de mon compte soit zsh mais j'ai ouvert le terminal et lancé bash et exécuté un script nommé prac002.sh , quel interpréteur shell serait utilisé pour exécuter le script, zsh ou bash ? Prenons l'exemple suivant :

[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 :** Voici le contenu du script

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

Réponse acceptée :

Parce que le script ne commence pas par un #! ligne shebang indiquant quel interpréteur utiliser, POSIX indique que :

Si le execl() échoue en raison d'une erreur équivalente à l'erreur [ENOEXEC] définie dans le volume Interfaces système de POSIX.1-2008, le shell doit exécuter une commande équivalente à l'invocation d'un shell avec le chemin résultant de la recherche comme son premier opérande , avec tous les arguments restants passés au nouveau shell, sauf que la valeur de « $0 » dans le nouveau shell peut être définie sur le nom de la commande. Si le fichier exécutable n'est pas un fichier texte, le shell peut ignorer l'exécution de cette commande. Dans ce cas, il écrira un message d'erreur et renverra un état de sortie de 126.

Cette formulation est un peu ambiguë et différents shells ont des interprétations différentes.

Dans ce cas, Bash exécutera le script en utilisant lui-même . D'un autre côté, si vous l'exécutiez à partir de zsh à la place, zsh utiliserait sh (tout ce qui se trouve sur votre système) à la place.

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

echo $BASH_VERSION
echo $ZSH_VERSION

Vous remarquerez que, depuis Bash, la première ligne affiche votre version, tandis que la seconde ne dit jamais rien, quel que soit le shell que vous utilisez.

  • Si votre /bin/sh est, disons, dash , aucune ligne n'affichera quoi que ce soit lorsque le script est exécuté à partir de zsh ou dash.
  • Si votre /bin/sh est un lien vers Bash, vous verrez la première ligne de sortie dans tous les cas.
  • Si /bin/sh est une version différente de Bash que vous n'utilisiez directement, vous verrez une sortie différente lorsque vous exécutez le script directement depuis bash et depuis zsh.
Connexe : Boucle dans les fichiers avec des espaces dans les noms ? ?

Le ps -p $$ La commande de la réponse de rools affichera également des informations utiles sur la commande utilisée par le shell pour exécuter le script.


Linux
  1. Quel shell dois-je utiliser - Tcsh Vs Bash ??

  2. Impossible d'arrêter un script Bash avec Ctrl+c ?

  3. Changer le répertoire de travail dans le shell avec un script python

  4. nom de base avec des espaces dans un script bash ?

  5. Ajout à $PYTHONPATH avec un script bash

Automatisez le traitement des images avec ce script Bash

Comment écrire un script bash avec des exemples

Bash Shebang

Shell Scripting Partie I :Premiers pas avec les scripts bash

Qu'est-ce que Shebang dans Linux Shell Scripting ?

Tutoriel d'introduction aux scripts Bash avec 5 exemples pratiques