Les scripts n'ont pas nécessairement un shebang
Si le script a été exécuté à partir de l'interprète, vous ne pouvez pas être sûr qu'il a le shebang du tout . Les scripts exécutés à partir de l'interpréteur n'ont pas besoin du shebang , si vous appelez l'interpréteur pour exécuter le code.
La réponse est donc non, aucune commande ne permet de savoir avec certitude quelle est la langue (interprète) avec laquelle exécuter le script. Vous pouvez cependant toujours regarder à l'intérieur du script et voir s'il a le shebang à découvrir.
Les règles en bref:
- Lorsque vous exécutez le script, l'appel de l'interprète annule toujours les shebangs possibles, exécutables ou non, shebang ou non.
- S'il n'est pas exécutable et exécuté à partir de l'interprète, le script n'a pas besoin de shebang.
- Si le script est exécuté sans appeler d'abord l'interprète, il a besoin (et utilise) le shebang pour savoir quel interprète appeler, et il doit être exécutable pour avoir la "permission" d'appeler l'interprète à partir de son shebang.
Si le script n'a pas de shebang, il n'y a aucune information (directe *) à l'intérieur du script pour indiquer quel interpréteur utiliser.
Ayant dit cela
Vous pouvez bien sûr toujours écrire un script de wrapper pour essayer de savoir si le script a le shebang et en lire l'interprète, puis l'exécuter à partir de l'interprète trouvé.
Un exemple
#!/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")
Enregistrez-le tryrun
en tant que dans $PATH
(par exemple ~/bin
, créez le répertoire s'il n'existe pas, déconnectez-vous puis reconnectez-vous), rendez-le exécutable . Puis en cours d'exécution:
tryrun /path/to/nonexecutablescript
appelle (testé) l'interprète correct sur mon non-exécutable python
et mes bash
scripts.
Explication
- Le script lit simplement la première ligne du script, supprime le
#!
et utilise le reste pour appeler l'interprète.
- S'il ne parvient pas à appeler un interprète valide, il déclenchera soit un,
PermissionError
soit un FileNotFoundError
.
Remarque
L'extension ( .sh
, .py
etc.) ne joue aucun rôle dans la détermination de l'interpréteur approprié sous Linux.
(* Il est bien sûr possible de développer un algorithme "intelligent" de devin pour déterminer la syntaxe à partir du code.)