O exec
syscall do kernel do Linux falha com EACCES
se o arquivo não for executável
Enquanto você pode fazer sh myprog.sh
, tentando executar o programa como ./myprog.sh
não pode funcionar, desde quando você faz isso:
- Bash usa a chamada do sistema exec em
./myprog.sh
- os shebangs são interpretados diretamente pela chamada de sistema
exec
do kernel do Linux, conforme explicado em: link
- o kernel do Linux se recusa a executar arquivos sem permissão executável
Isso pode ser verificado com main.c
:
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
e myprog.sh
:
#!/bin/sh
echo worked
Se myprog.sh
não for executável, main
falhará com:
execve: Permission denied
13
13
Testado no Ubuntu 17.10, gcc -std=c99
.
POSIX 7 menciona que em:
The exec functions, except for fexecve(), shall fail if:
[EACCES]
Search permission is denied for a directory listed in the new process image file's path prefix, or the new process image file denies execution permission.
Outras razões podem ser encontradas em: link