Стандарт оболочки POSIX говорит на этом сайте
http://pubs.opengroup.org/onlinepubs/9699919799/
о том, как оболочки используют PATH
для поиска исполняемых файлов:
«Список следует искать от начала до конца, применяя имя файла к каждому префиксу, пока не будет найден исполняемый файл с указанным именем и соответствующими разрешениями на выполнение».
Ну, это не так, как это работает в реальной реализации POSIX:
man which
говорит:
"возвращает пути к файлам (или ссылкам), которые будут выполняться в текущей среде, если бы его аргументы были заданы в качестве команд в строго POSIX-совместимой оболочке. Это делается путем поиска в PATH исполняемых файлов, соответствующих именам аргументов. Он не следует по символическим ссылкам. "
Хорошо, давайте посмотрим на эту ситуацию:
$ 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
Хорошо, вот символическая ссылка в PATH
с правильным именем, и ls
сообщает, что она является исполняемой.
which
вообще не смотрит на это, а интересуется только тем, на что он указывает.
Это несмотря на тот факт, что man which
явно говорит, что он не следует по символическим ссылкам (а мы действительно видим, что это не так, потому which foobar
не печатает foobar1
), а также то, что приведенная выше документация оболочки POSIX, никогда не упоминает о следующем символические ссылки в алгоритме PATH
.
Итак, which
и существующие оболочки неправильны, или я не понимаю документацию?
УТОЧНИТЬ:
Я знаю и могу объяснить существующее поведение. Мой вопрос не "как это работает?». Что я знаю.
Мой вопрос касается документации: где моя ошибка в следовании документации, которую я цитировал. Или документация неверна?
МОТИВАЦИЯ: Почему меня это волнует?
Ну, я реализатор. У разных исполнителей разные требования. Для меня требование состоит в том, чтобы слово текущего стандарта POSIX ДОЛЖНО сопровождаться ТОЧНО (или, точнее, лучшим, каким оно может быть, потому что сам стандарт несколько глючит). Как будто это было слово Божие.
Теперь стандартная формулировка довольно ясна - следующие символические ссылки не упоминаются, где во многих других местах упоминается, где это необходимо сделать. Так что в этом случае нет.
Тем не менее, я всегда проверяю, как ведут себя dash
и bash
, просто чтобы убедиться. Теперь, конечно, есть небольшая проблема здесь , как хорошо, dash
, даже если он объявлен как POSIX, имеет множество мелких ошибок с соответствии с POSIX. bash
, мне еще не удалось найти каких-либо ошибок в POSIX, но ... bash на самом деле не POSIX, это гораздо больше.
Так что у вас есть это. Вот почему я забочусь