Le « invoqué comme » fait référence à quoi que ce soit que le processus de démarrage Bash met dans son argument de ligne de commande « zeroth », argv[0].
Lorsqu'un programme est démarré avec les exec*()appels système , ils ne connaissent pas vraiment le nom du fichier binaire contenant le programme, mais à la place, le processus d'appel est libre d'y mettre ce qu'il veut. Habituellement, bien sûr, le nom est tiré du système de fichiers, donc si vous exécutez /bin/sh, c'est ce qui est mis là. Et si /bin/shc'est Bash, il ne doit pas nécessairement être un lien symbolique, il peut s'agir d'un lien dur ou simplement d'une autre copie du programme shell.
Comme exemple de définition du "nom du programme", la execcommande de Bash peut définir l'argument zéro avec l' -aoption. (On pourrait faire de même avec Perl, ou directement avec C, etc.)
Voici mynameun programme C simple qui affiche simplement son argument zéro, le nom qu'il voit lui-même:
$ ./myname
I am ./myname
$ (exec -a something ./myname )
I am something
$ mv ./myname somename
$ ln -s somename othername
$ ./somename
I am ./somename
$ ./othername
I am ./othername
La source:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Mais, pour répondre aux questions numérotées ...
(1 & 4) en cours d'exécution sh somescriptexécutera tout ce qui se shtrouve sur votre PATH, probablement /bin/shmais peut-être quelque chose comme/usr/xpg4/bin/sh .
- S'il s'agit de Bash, il s'exécute en mode POSIX, car il voit le nom
sh.
- S'il s'agit du shell Z ou du shell Korn, il voit également le nom
sh, mais il fonctionne en mode "SH compatible", qui vise à être compatible avec le shell Bourne et est subtilement différent du mode conforme POSIX complet dans ces deux shells. .
- Ce pourrait être le shell Almquist, un véritable shell Bourne, ou autre chose, bien sûr.
(2 & 5) La course bash somescriptse déroulera en mode Bash normal (encore une fois, cela dépend bien sûr de ce que bashvous PATHêtes.)
(3) Ici, le nom du script est donné directement à l'appel système à la place du fichier programme. Le noyau lit la ligne de hachage et l'utilise pour exécuter le script.
(6) C'est le complexe. Il est similaire à (3), mais l'appel système pour démarrer le programme échoue ( ENOEXEC (Exec format error)), car il n'y a pas de ligne de hachage. Ce qui se passe ensuite dépend de si le shell que vous exécutez est lui - même en mode POSIX. POSIX requiert qu'un shell conforme à POSIX se comporte d'une manière spécifique en réponse à ENOEXEC. Cependant, il existe une certaine marge de manœuvre dans "une commande équivalente à l'invocation d'un shell", ce qui signifie que différents shells font des choses différentes.
- Le shell Bourne Again se réexécute dans le même mode avec le nom du script comme premier argument de ligne de commande. Dans son mode conforme POSIX, il s'exécute bien sûr lui-même dans son mode conforme POSIX, obéissant ainsi à l'exigence POSIX d'invoquer un shell conforme POSIX.
- Le shell Z, le shell Almquist et le shell Korn s'exécutent
/bin/shavec le nom du script inséré avant les autres arguments comme premier argument de ligne de commande. Le shell Z, le shell Almquist et le shell Korn (tentent) d'invoquer un shell conforme POSIX à force de supposer que le /bin/shprogramme en est un.