Der POSIX-Shell-Standard besagt dies auf dieser Site
http://pubs.opengroup.org/onlinepubs/9699919799/
Informationen darüber, wie Shells PATH
zur Suche nach ausführbaren Dateien verwendet werden:
"Die Liste wird von Anfang bis Ende durchsucht, wobei der Dateiname auf jedes Präfix angewendet wird, bis eine ausführbare Datei mit dem angegebenen Namen und den entsprechenden Ausführungsberechtigungen gefunden wird."
Nun, so scheint es in einer echten POSIX-Implementierung nicht zu funktionieren:
man which
sagt:
msgstr "" "gibt die Pfadnamen der Dateien (oder Links) zurück, die in der aktuellen Umgebung ausgeführt würden, wenn ihre Argumente als Befehle in einer streng POSIX - konformen Shell angegeben worden wären. Dies geschieht, indem der Pfad nach ausführbaren Dateien durchsucht wird, die mit den Namen der Dateien übereinstimmen Argumente. Es folgt keinen symbolischen Verknüpfungen. "
OK, schauen wir uns diese Situation an:
$ 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, hier ist ein symbolischer Link PATH
mit dem richtigen Namen, und es wird gemeldet ls
, dass er ausführbar ist.
which
schaut es gar nicht an, sondern interessiert sich nur dafür, worauf es hinweist.
Trotz der Tatsache, dass beide man which
ausdrücklich besagen, dass sie keinen symbolischen Links folgen (und wir sehen, dass sie nicht folgen, weil which foobar
sie nicht gedruckt werden foobar1
) und dass in der oben zitierten POSIX-Shell-Dokumentation niemals erwähnt wird, dass Symlinks im PATH
Algorithmus folgen .
Ist which
und sind die vorhandenen Shells falsch oder verstehe ich die Dokumentation nicht?
ZU KLÄREN:
Ich kenne und kann das vorhandene Verhalten erklären. Meine Frage ist nicht "Wie funktioniert das?". Dass ich weiß.
Meine Frage bezieht sich auf die Dokumentation: Wo liegt mein Fehler bei der Befolgung der von mir zitierten Dokumentation? Oder ist die Dokumentation falsch?
MOTIVATION: Warum kümmert es mich?
Nun, ich bin ein Implementierer. Unterschiedliche Implementierer haben unterschiedliche Anforderungen. Für mich ist die Anforderung, dass das Wort des aktuellen POSIX-Standards GENAU befolgt werden MUSS (oder genauer gesagt, das Beste, weil der Standard selbst etwas fehlerhaft ist). Als ob es das Wort Gottes wäre.
Nun ist der Standardtext ziemlich klar - folgende Symlinks werden nicht erwähnt, an vielen anderen Stellen wird erwähnt, wo dies getan werden muss. Also in diesem Fall nicht.
Ich überprüfe jedoch immer genau, wie dash
und wie ich mich bash
verhalte, um sicherzugehen. Jetzt gibt es natürlich auch hier ein kleines Problem, dash
obwohl es als POSIX berechnet wird und viele kleine Fehler in Übereinstimmung mit POSIX aufweist. bash
Ich habe noch keine Bugs mit POSIX gefunden, aber ... bash ist nicht wirklich POSIX, es ist viel mehr.
Da haben Sie es also. Deshalb ist es mir wichtig.
$PATH
hat keine Symlinks.
lstat(2)
). Beispielsweise werden in der Beschreibung open(2)
nur Symlinks erwähnt, wenn über das Verhalten von gesprochen wird O_CREAT | O_EXCL
. Es muss nicht angegeben werden, dass die Zieldatei geöffnet wird.
$PATH
Dose enthält Symlinks. Versuchen Sie eswhich sh
.