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:
- Cuando ejecuta el script, llamar al intérprete siempre anula posibles shebangs, ejecutables o no, shebang o no.
- Si no es ejecutable y se ejecuta desde el intérprete, el script no necesita shebang.
- Si el script se ejecuta sin llamar primero al intérprete, necesita (y usa) el shebang para averiguar a qué intérprete llamar, y debe ser ejecutable para tener el "permiso" para llamar al intérprete desde su shebang.
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
#!/usr/bin/env python3
import subprocess
import sys
args = sys.argv[1:]; script = args[0]
try:
lang = open(script).readlines()[0].replace("#!", "").strip().split()[-1]
cmd = [lang, script]+args[1:]
subprocess.call(cmd)
except (PermissionError, FileNotFoundError, IndexError):
print("No valid shebang found")
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:
tryrun /path/to/nonexecutablescript
llama (probado) al intérprete correcto en mi no ejecutable python
y bash
scripts.
Explicación
- El guión simplemente lee la primera línea del guión, elimina el
#!
y usa el resto para llamar al intérprete.
- Si no puede llamar a un intérprete válido, elevará a
PermissionError
o a FileNotFoundError
.
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).