Si quiero ejecutar un script bash que no tiene establecido su permiso de ejecución, puedo hacer lo siguiente:
bash script.sh
¿Qué debo usar en lugar de bash
si el script no es ejecutable y no conozco al intérprete correcto? ¿Hay algún comando que busque el intérprete desde la línea shebang y ejecute el script con él?
bash whatever
funciona, ¿por qué usar algo diferente? bash está disponible en prácticamente todos los sistemas * ix, así que ¿por qué molestarse ...Respuestas:
Sí. Se llama
perl
:Esto se menciona en la documentación de Perl :
fuente
.js
también funciona?#!
. Parece que tengo un poco más ahora y no he experimentado este problema.man perlrun
tímidamente que admite que es "un poco extraño" :). Creo que esto debería tratarse como una curiosidad dirigida a entornos que no son UNIX y versiones muy muy antiguas de UNIX.Los guiones no necesariamente tienen un shebang
Si el script se ejecutó desde el intérprete, no puede estar seguro de que tenga el shebang en absoluto . Las secuencias de comandos, ejecutadas desde el intérprete no necesitan el shebang , si llama al intérprete para ejecutar el código.
Por lo tanto, la respuesta es no, no hay ningún comando que descubra con seguridad cuál es el idioma (intérprete) con el que ejecutar el script. Sin embargo, siempre puede mirar dentro del script y ver si tiene el shebang para descubrirlo.
Las reglas en resumen:
Sin embargo, si el script no tiene shebang, no hay información (directa *) dentro del script para indicar qué intérprete usar.
Una vez dicho esto
Por supuesto, siempre puede escribir una secuencia de comandos de envoltura para intentar averiguar si la secuencia de comandos tiene el shebang y leer el intérprete a partir de eso, posteriormente ejecutarlo desde el intérprete encontrado.
Un ejemplo
Guárdelo como
tryrun
en$PATH
(p~/bin
. Ej. , Cree el directorio si no existe, cierre sesión y vuelva a iniciarlo), hágalo ejecutable . Luego corriendo:llama (probado) al intérprete correcto en mi no ejecutable
python
ybash
scripts.Explicación
#!
y usa el resto para llamar al intérprete.PermissionError
o aFileNotFoundError
.Nota
La extensión (
.sh
,.py
etc.) no juega ningún papel en la determinación del intérprete apropiado en Linux.(* Por supuesto, es posible desarrollar un algoritmo de conjetura "inteligente" para determinar la sintaxis del código).
fuente
Puede lograr esto con un script como este:
Así:
Recomiendo no hacer esto. Los permisos están ahí por una razón. Este es un programa para subvertir permisos.
Tenga en cuenta que el manejo de shebang es una función del núcleo (en el código fuente de Linux -
fs/binfmt_script.c
). Básicamente, el proceso que invoca un script directamente no conoce el#!
- el núcleo lo usa para determinar que necesita lanzar un intérprete.fuente