Je suis nouveau dans les scripts shell et de nombreux livres ont écrit qui utilisent la ligne #! (Sha-bang) au début du script pour invoquer l'interpréteur. Et cela invoquera un nouveau shell pour le script et fera l'interprétation ligne par ligne. de mon script de base fonctionne toujours sans la ligne magique.
donc mes questions sont:
- d'où mon script de base a obtenu l'interprète.
- comment le script a-t-il réussi à localiser l'interprète.
laissez-moi maintenant vous parler de mon script de base, il contient juste la ligne suivante:
echo "script de base sans les lignes magiques"
bash
shell-script
user1678213
la source
la source
Réponses:
Si la ligne magique n'est pas fournie, un shell par défaut est utilisé pour exécuter le script. Ce shell par défaut peut être soit le shell Bourne (sh), ce qui est le cas dans certaines versions, mais dans certaines autres versions, le shell par défaut utilisé est le même que le shell de connexion pour l'exécuter. La chose est: ne laissez pas le système décider du shell, fournissez toujours le shell que vous voulez dans la première ligne.
la source
/bin/sh
, juste pour être le premiersh
exécutable trouvé lors de l'exploration d'un PATH conforme.Lorsque vous exécutez un programme, le noyau vérifie s'il démarre par une séquence d'octets magiques . Si le fichier exécutable commence par
#!
, le noyau interprète le reste de la ligne comme un nom d'interpréteur. Si le fichier exécutable commence par\177ELF
(où\177
est l'octet 127), il charge le fichier en tant qu'exécutable ELF ; c'est le type normal sur la plupart des systèmes Unix de nos jours.Si le noyau ne reconnaît pas le format de fichier, il refuse d'exécuter le fichier et renvoie l'erreur ENOEXEC (erreur de format Exec). Lorsque le shell le remarque, il prend sur lui d'exécuter le programme en tant que script shell.
Pour en témoigner en action, ajoutez quelques commandes à votre script:
(Ceci est pour Linux, ajustez pour les autres unités.) Essayez ensuite d'exécuter ce script à partir de divers shells. Vous verrez que certains shells engendrent de nouvelles instances d'eux-mêmes pour exécuter le script (bash, ksh93) tandis que d'autres
/bin/sh
apparaissent (dash, pdksh, zsh).la source
ls -l
commande? Ceci:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-? Si oui, que dit-il? En outre, remarqué que j'aiSHELL=/bin/bash
surenv
, mais le changer ne semble pas un changement de comportement. Peut-être que ce n'est pas lié?ls -l /proc/$$/exe
, en fait). Lesexe
liens pointent vers le shell qui exécute votre script. Lorsque vous exécutez votre script, vous verrez que c'est bash qui interprète le script. Si vous l'exécutez depuis pdksh par exemple, il s'exécute/bin/sh
. Je ne connais aucun shell qui utilise laSHELL
variable d'environnement ou le shell de connexion dans ce cas./etc/passwd
change le shell qui est exécuté lorsque vous vous connectez via SSH ou sur une console texte. Cela ne change pas quel shell pourrait exécuter des scripts./etc/passwd
à décider quel shell utiliser, ils ont soit créé une instance d'eux-mêmes, soit exécuté/bin/sh
.C'est probablement l'une des 3 possibilités suivantes:
Vous appelez le script directement avec l'interpréteur, IE: bash script.sh
Le nom du fichier de script a une extension .sh, qui permet au système de rechercher le programme par défaut pour ce type de fichier
L'environnement shell que vous utilisez exécute lui-même l '«écho», car je ne peux que deviner que le fichier de script est exécutable. Si, par exemple, vous allez utiliser un shell bash et avoir une commande dans votre fichier qui n'est utilisée que par ksh, alors vous verrez que cela ne fonctionnera pas.
Bonne chance!
la source