Bash es un intérprete; acepta entrada y hace lo que quiera. No necesita prestar atención al bit ejecutable. De hecho, Bash es portátil y puede ejecutarse en sistemas operativos y sistemas de archivos que no tienen ningún concepto de bit ejecutable.
Lo que importa del bit ejecutable es el núcleo del sistema operativo. Cuando el kernel de Linux realiza exec
, por ejemplo, comprueba que el sistema de archivos no está montado con una noexec
opción, comprueba el bit ejecutable del archivo de programa y hace cumplir los requisitos impuestos por los módulos de seguridad (como SELinux o AppArmor).
Tenga en cuenta que el bit ejecutable es un tipo de control bastante discrecional. En un sistema Linux x86-64, por ejemplo, puede omitir la verificación del núcleo del bit ejecutable invocando explícitamente /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
como intérprete :
cp /bin/ls /tmp/
chmod -x /tmp/ls
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /tmp/ls
Esto es algo análogo al abastecimiento del código fuente de Bash en Bash, excepto que ld.so
es el intérprete, y el código que ejecuta es código de máquina en formato ELF.
chmod
pueda permitirle establecer permisos (incluido `x) con un número octal le da una idea de la época de la que proviene. No me sorprendería que comenzara como un indicador rápido y sucio de "este es un archivo binario que puede ejecutar", desde los días previos a la invención de she-bang, pero no tengo evidencia de eso