As permissões do link simbólico em si são irrelevantes. Você não poderia nem mudá-las se você tentasse.
O que importa são permissões do arquivo subjacente.
É bom ter diretórios em seu PATH incluindo links simbólicos para executáveis. De fato, é provável que muitos executáveis em seu PATH sejam links simbólicos. Por exemplo, em sistemas debian / ubuntu-like:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jan 23 2017 /bin/sh -> dash
Documentação
De man chmod
:
chmod never changes the permissions of symbolic links; the chmod system call cannot change their permissions. This is not a problem since the permissions of symbolic links are never used. However, for each symbolic link listed on the command line, chmod changes the permissions of the pointed-to file. In contrast, chmod ignores symbolic links encountered during recursive directory traversals. [Emphasis added.]
Exemplo
O shell tem um teste, -x
, para determinar se um arquivo é executável. Vamos tentar isso:
$ 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
Portanto, assim como você encontrou com which
, o shell não considera um executável de softlink a menos que o arquivo subjacente seja executável.
Como funciona?
Em um sistema Debian, which
é um script de shell. A seção relevante do código é:
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
Como você pode ver, ele usa o teste -x
para determinar se um arquivo é executável.
POSIX especifica o teste -x
da seguinte forma:
-x pathname
True if pathname resolves to an existing directory entry for a file for which permission to execute the file (or search it, if it is a directory) will be granted, as defined in File Read, Write, and Creation. False if pathname cannot be resolved, or if pathname resolves to an existing directory entry for a file for which permission to execute (or search) the file will not be granted. [Emphasis added.]
Portanto, POSIX verifica o nome do caminho resolve para. Em outras palavras, aceita links simbólicos.
função exec POSIX
A função execut POSIX segue os links simbólicos. A especificação POSIX é longa para especificar condições de erro que podem ser relatadas se os links simbólicos forem circulares ou muito profundos, como:
[ELOOP]
A loop exists in symbolic links encountered during resolution of the path or file argument.
[ELOOP]
More than {SYMLOOP_MAX} symbolic links were encountered during resolution of the path or file argument.
[ENAMETOOLONG]
As a result of encountering a symbolic link in resolution of the path argument, the length of the substituted pathname string exceeded {PATH_MAX}.