Standard powłoki POSIX mówi na tej stronie
http://pubs.opengroup.org/onlinepubs/9699919799/
o tym, jak powłoki używają PATH
do wyszukiwania plików wykonywalnych:
„Listę należy przeszukiwać od początku do końca, stosując nazwę pliku do każdego prefiksu, aż do znalezienia pliku wykonywalnego o określonej nazwie i odpowiednich uprawnieniach do wykonywania.”
Cóż, nie tak to wygląda w rzeczywistej implementacji POSIX:
man which
mówi:
"zwraca nazwy ścieżek plików (lub linków), które byłyby wykonane w bieżącym środowisku, gdyby ich argumenty zostały podane jako polecenia w ściśle zgodnej z POSIX powłoce. Robi to, przeszukując PATH w poszukiwaniu plików wykonywalnych pasujących do nazw argumenty. Nie podąża za dowiązaniami symbolicznymi. ”
OK, spójrzmy na tę sytuację:
$ 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, tutaj jest dowiązanie symboliczne PATH
z poprawną nazwą i jest zgłaszane przez program ls
jako wykonywalny.
which
wcale na to nie patrzy, ale interesuje go tylko to, na co wskazuje.
Że pomimo faktu, że oba man which
wyraźnie mówią, że nie podąża za dowiązaniami symbolicznymi (i rzeczywiście widzimy, że nie, ponieważ which foobar
nie drukuje foobar1
), a także, że cytowana powyżej dokumentacja powłoki POSIX nigdy nie wspomina o dowiązaniach symbolicznych w PATH
algorytmie.
Tak więc, which
czy istniejące powłoki są nieprawidłowe, czy też nie rozumiem dokumentacji?
WYJAŚNIĆ:
Znam i potrafię wyjaśnić istniejące zachowanie. Moje pytanie nie brzmi „jak to działa?”. To wiem.
Moje pytanie dotyczy dokumentacji: gdzie jest mój błąd w stosowaniu cytowanej przeze mnie dokumentacji. A może dokumentacja jest nieprawidłowa?
MOTYWACJA: Dlaczego mnie to obchodzi?
Jestem implementatorem. Różni realizatorzy mają różne wymagania. Dla mnie wymaganiem jest, aby słowo obecnego standardu POSIX MUSI BYĆ DOKŁADNIE WYKONANE (lub, dokładniej, najlepiej, jak może być, ponieważ sam standard jest nieco błędny). Jakby to było słowo Boże.
Teraz standardowe sformułowanie jest dość jasne - nie wymieniono następujących dowiązań symbolicznych, gdzie w wielu innych miejscach wspomniano, gdzie należy to zrobić. Więc w tym przypadku nie.
Ja jednak zawsze dokładnie sprawdzić, jak dash
i bash
zachowywać, żeby się upewnić. Oczywiście jest tu również mały problem, dash
mimo że jest rozliczany jako POSIX, ma wiele małych błędów zgodnych z POSIX. bash
, Jeszcze nie znalazłem żadnych błędów w POSIX, ale ... bash nie jest tak naprawdę POSIX, to o wiele więcej.
Więc masz to. Dlatego mnie to obchodzi.
$PATH
nie ma żadnych dowiązań symbolicznych.
lstat(2)
), ich przestrzeganie zwykle nie jest określone. Na przykład, opis open(2)
tylko wzmiankuje dowiązania symboliczne, gdy mówi się o zachowaniu O_CREAT | O_EXCL
. Nie trzeba podawać, że plik docelowy zostanie otwarty.
$PATH
może zawierać dowiązania symboliczne. Spróbowaćwhich sh
.