Bash é um intérprete; aceita entrada e faz o que quiser. Não precisa prestar atenção ao bit executável. Na verdade, o Bash é portátil e pode ser executado em sistemas operacionais e sistemas de arquivos que não possuem nenhum conceito de bit executável.
O que importa sobre o bit executável é o kernel do sistema operacional. Quando o kernel Linux executa exec
, por exemplo, verifica se o sistema de arquivos não está montado com a opção noexec
, verifica o bit executável do arquivo de programa e aplica quaisquer requisitos impostos pelos módulos de segurança (como o SELinux ou AppArmor).
Observe que o bit executável é um tipo de controle bastante discricionário. Em um sistema Linux x86-64, por exemplo, você pode ignorar a verificação do kernel do bit executável explicitamente chamando /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
como o intérprete :
cp /bin/ls /tmp/
chmod -x /tmp/ls
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /tmp/ls
Isso é um pouco análogo à origem do código-fonte Bash no Bash, exceto que ld.so
é o interpretador e o código que ele executa é código de máquina no formato ELF.