As permissões de execução são suficientes para o kernel executar o arquivo.
Se o arquivo começar com #!
, ele verá um script, analisará a linha para descobrir o caminho do interpretador e um argumento opcional e executará esse interpretador com esse argumento opcional e o caminho do arquivo como argumento.
Por exemplo, se o arquivo começar com:
#! /usr/bin/python -E
O kernel muda o execve("/path/to/the-script", ["the-script", "arg"], [envs])
para execve("/usr/bin/python", ["/usr/bin/python", "-E", "/path/to/the-script", "arg"], [envs])
.
Sem as permissões de execução, nunca teria chegado tão longe.
Agora, nesse ponto, o que importa é a permissão de execução do intérprete. É executáveis, então funciona normalmente.
No entanto, mais tarde, /usr/bin/python
desejará abrir /path/to/the-script
para ler e interpretar o código nele. E para isso, precisará de permissão de leitura para o arquivo. A menos que tenha mudado euid desde a última vez (por exemplo, se o arquivo /usr/bin/python
tivesse o bit suid / sgid), se você não tinha permissões de leitura antes, você ainda não o tem.
Assim, você pode executar um script bem se tiver permissão de execução apenas para ele. É só que se o interpretador precisar abri-lo para ler seu conteúdo, ele falhará (e você verá que a mensagem de erro vem do interpretador, não do shell do qual você está tentando executar o script). Em um script como:
#! /bin/echo Here goes
Você verá que não ter permissão de leitura não importa, pois echo
não está tentando abrir o arquivo para leitura.