Les scripts n'ont pas nécessairement un shebang
Si le script a été exécuté par l'interpréteur, vous ne pouvez pas être sûr qu'il contient le . 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, il n'y a pas de commande pour 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 y a le shebang à découvrir.
Les règles en bref:
- Lorsque vous exécutez le script, l'appel de l'interpréteur toujours remplace les éventuels shebangs, exécutables ou non, shebang ou non.
- S'il n'est pas exécutable et qu'il exécute depuis l'interpréteur, le script n'a pas besoin de shebang.
- Si le script est exécuté sans appeler d'abord l'interpréteur, il faut (et utilise) le shebang pour savoir quel interpréteur appeler, et il doit être exécutable avoir la "permission" d'appeler l'interprète de son shebang.
Si le script n'a pas de shebang, il n'y a pas d'informations (directes *) dans le script pour indiquer quel interpréteur utiliser.
Cela dit,
Vous pouvez bien sûr toujours écrire un script wrapper sur try pour savoir si le script a le shebang et lire l'interpréteur à partir de celui-ci, puis l'exécuter depuis l'interpréteur 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 sous tryrun
dans $PATH
(par exemple ~/bin
, créez le répertoire s'il n'existe pas, déconnectez-vous et reconnectez-vous), rendez-le exécutable . Puis en cours d'exécution:
tryrun /path/to/nonexecutablescript
appelle (testé) le bon interpréteur sur mes scripts non exécutables python
et bash
.
Explication
- Le script lit simplement la première ligne du script, supprime
#!
et utilise le reste pour appeler l'interpréteur.
- S'il ne parvient pas à appeler un interpréteur 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 de prédiction "intelligent" pour déterminer la syntaxe à partir du code.)