La norme shell POSIX dit sur ce site
http://pubs.opengroup.org/onlinepubs/9699919799/
sur la façon dont les shells utilisent PATH
pour rechercher les exécutables:
"La liste doit être recherchée du début à la fin, en appliquant le nom de fichier à chaque préfixe, jusqu'à ce qu'un fichier exécutable avec le nom spécifié et les autorisations d'exécution appropriées soit trouvé."
Eh bien, ce n'est pas ainsi que cela semble fonctionner dans une implémentation POSIX réelle:
man which
dit:
"renvoie les chemins d'accès des fichiers (ou liens) qui seraient exécutés dans l'environnement actuel, si ses arguments avaient été donnés sous forme de commandes dans un shell strictement conforme à POSIX. Il le fait en recherchant dans le PATH des fichiers exécutables correspondant aux noms des arguments. Il ne suit pas les liens symboliques. "
OK, regardons cette situation:
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
OK, voici un lien symbolique PATH
avec le nom correct, et il est signalé par ls
être exécutable.
which
ne le regarde pas du tout, mais ne s'intéresse qu'à ce qu'il pointe.
Cela malgré le fait que les deux man which
disent explicitement qu'il ne suit pas les liens symboliques (et en effet nous le voyons pas, car which foobar
ne s'imprime pas foobar1
), et aussi que la documentation du shell POSIX citée ci-dessus, ne mentionne jamais de suivre les liens symboliques dans l' PATH
algorithme.
Alors, est which
-ce que les obus existants sont faux, ou est-ce que je ne comprends pas la documentation?
CLARIFIER:
Je connais et peux expliquer le comportement existant. Ma question n'est pas "comment ça marche?". Ce que je sais.
Ma question concerne la documentation: où est mon erreur en suivant la documentation que j'ai citée. Ou la documentation est-elle erronée?
MOTIVATION: Pourquoi je m'en soucie?
Eh bien, je suis un réalisateur. Les différents implémenteurs ont des exigences différentes. Pour moi, l'exigence est que le mot de la norme POSIX actuelle DOIT être suivi EXACTEMENT (ou, plus précisément, le meilleur possible, car la norme elle-même est quelque peu boguée). Comme si c'était la parole de Dieu.
Maintenant, le libellé standard est assez clair - les liens symboliques suivants ne sont pas mentionnés, alors que dans de nombreux autres endroits, il est mentionné où cela doit être fait. Donc, dans ce cas, ne le faites pas.
Cependant, je vérifie toujours comment dash
et je me bash
comporte, juste pour m'assurer. Maintenant, bien sûr, il y a un petit problème ici aussi, dash
même s'il est facturé comme POSIX, il y a beaucoup de petits bogues conformes à POSIX. bash
, Je n'ai pas encore trouvé de bugs avec POSIX, mais ... bash n'est pas réellement POSIX, c'est bien plus que cela.
Alors voilà. Voilà pourquoi je m'en soucie.
$PATH
n'a pas de liens symboliques.
lstat(2)
), les suivre n'est généralement pas indiqué. Par exemple, la description de open(2)
ne mentionne que les liens symboliques lorsque l'on parle du comportement de O_CREAT | O_EXCL
. Il n'est pas nécessaire d'indiquer que le fichier cible sera ouvert.
$PATH
peut contenir des liens symboliques. Essayezwhich sh
.