Разрешения самой символической ссылки не имеют значения. Вы даже не могли бы изменить их, если бы попытались.
Что важно, так это права доступа к базовому файлу.
Хорошо, чтобы в вашем PATH каталоги содержали символические ссылки на исполняемые файлы. На самом деле, вполне вероятно, что многие исполняемые файлы в вашем PATH являются символическими ссылками. Например, в системах, подобных debian / ubuntu:
$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 Jan 23 2017 /bin/sh -> dash
Документация
От man chmod
:
chmod никогда не меняет права доступа к символическим ссылкам; системный вызов chmod не может изменить их разрешения. Это не проблема, поскольку разрешения символических ссылок никогда не используются. Однако для каждой символической ссылки, указанной в командной строке, chmod изменяет права доступа к указанному файлу. Напротив, chmod игнорирует символические ссылки, встречающиеся во время рекурсивных обходов каталогов. [Акцент добавлен.]
пример
В оболочке есть тест, -x
чтобы определить, является ли файл исполняемым. Давайте попробуем это:
$ ls -l total 0 lrwxrwxrwx 1 john1024 john1024 7 Dec 12 23:36 foo -> foobar1 -rw-rw---- 1 john1024 john1024 0 Dec 12 23:36 foobar1 $ [ -x foo ] && echo foo is executable $ chmod +x foobar1 $ [ -x foo ] && echo foo is executable foo is executable
Таким образом, как и в случае с which
оболочкой, оболочка не считает исполняемый файл программной ссылки, если базовый файл не является исполняемым.
Как работает
В системе Debian which
это сценарий оболочки. Соответствующий раздел кода:
case $PROGRAM in */*) if [ -f "$PROGRAM" ] && [ -x "$PROGRAM" ]; then puts "$PROGRAM" RET=0 fi ;; *) for ELEMENT in $PATH; do if [ -z "$ELEMENT" ]; then ELEMENT=. fi if [ -f "$ELEMENT/$PROGRAM" ] && [ -x "$ELEMENT/$PROGRAM" ]; then puts "$ELEMENT/$PROGRAM" RET=0 [ "$ALLMATCHES" -eq 1 ] || break fi done ;; esac
Как видите, он использует -x
тест, чтобы определить, является ли файл исполняемым.
POSIX определяет -x
тест следующим образом:
-x pathname
Истинно, если pathname разрешает существующую запись каталога для файла, для которого будет предоставлено разрешение на выполнение файла (или поиск в нем, если это каталог), как определено в File Read, Write и Creation. False, если путь не может быть разрешен, или если путь разрешается к существующей записи каталога для файла, для которого разрешение на выполнение (или поиск) файла не будет предоставлено. [Акцент добавлен.]
Так, POSIX проверяет, что путь решает к. Другими словами, он принимает символические ссылки.
POSIX exec функция
Функция POSIX exec следует символическим ссылкам. Спецификация POSIX продолжается, чтобы указать условия ошибки, о которых она может сообщить, если символические ссылки имеют круглую или слишком глубокую форму, например:
[ELOOP]
Цикл существует в символических ссылках, встречающихся во время разрешения пути или аргумента файла.
[ELOOP]
Более чем символических ссылок было найдено во время разрешения пути или аргумента файла.
[ENAMETOOLONG]
В результате обнаружения символической ссылки в разрешении аргумента пути длина замещенной строки имени пути превысила .