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/sh
c'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 exec
commande de Bash peut définir l'argument zéro avec l' -a
option. (On pourrait faire de même avec Perl, ou directement avec C, etc.)
Voici myname
un 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 somescript
exécutera tout ce qui se sh
trouve sur votre PATH
, probablement /bin/sh
mais 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 somescript
se déroulera en mode Bash normal (encore une fois, cela dépend bien sûr de ce que bash
vous 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/sh
avec 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/sh
programme en est un.