Les scripts n'ont pas nécessairement de shebang
Si le script a été exécuté à partir de l'interpréteur, vous ne pouvez pas être sûr qu'il possède le shebang à tous . 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'existe pas de commande qui permette de savoir avec certitude quel est le langage (interpréteur) avec lequel le script doit être exécuté. Vous pouvez cependant toujours regarder à l'intérieur du script et voir s'il a le shebang pour le savoir.
Les règles en bref :
- Lorsque vous exécutez le script, l'appel de l'interpréteur toujours annule les éventuels shebangs, qu'ils soient exécutables ou non, qu'il s'agisse d'un shebang ou non.
- S'il n'est pas exécutable et exécuté de 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 besoins (et utilise) le shebang pour savoir quel interprète appeler, et il doit être exécutable pour avoir la "permission" d'appeler l'interpréteur à partir de son shebang.
Si le script n'a pas de shebang, il n'y a pas d'information (directe*) à l'intérieur du script pour dire quel interpréteur utiliser.
Ceci étant dit
Vous pouvez bien sûr toujours écrire un script pour 為す pour savoir si le script a le shebang et lire l'interpréteur à partir de celui-ci, puis l'exécuter à partir de 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")
-
Sauvegarder en tant que tryrun
en $PATH
(par exemple ~/bin
(créer le répertoire s'il n'existe pas, se déconnecter et se reconnecter), le rendre exécutable . Puis en courant :
tryrun /path/to/nonexecutablescript
appelle (testé) l'interpréteur correct sur mon fichier non exécutable python
y bash
scripts.
Explication
- Le script lit simplement la première ligne du script, supprime l'élément
#!
et utilise le reste pour appeler l'interprète.
- S'il ne parvient pas à appeler un interprète valide, il lèvera soit un
PermissionError
ou un FileNotFoundError
.
Note
L'extension ( .sh
, .py
etc.) ne joue aucun rôle dans la détermination de l'interprète approprié sous Linux.
(*Il est bien sûr possible de développer un algorithme "intelligent" pour déterminer la syntaxe à partir du code).