Si je veux exécuter un script bash dont les autorisations d'exécution ne sont pas définies, je peux faire:
bash script.sh
Que dois-je utiliser à la place de bash
si le script n'est pas exécutable et que je ne connais pas l'interprète correct? Existe-t-il une commande qui recherche l'interprète de la ligne shebang et exécute le script avec?
bash whatever
fonctionne, pourquoi utiliser quelque chose de différent? bash est disponible sur pratiquement tous les systèmes * ix, alors pourquoi s'embêter ...Réponses:
Oui. Cela s'appelle
perl
:Ceci est mentionné dans la documentation de Perl :
la source
.js
fonctionne aussi?#!
. J'ai l'air de quelques-uns à plus maintenant, et n'ai pas connu ce problème.man perlrun
pudique d'admettre que c'est "légèrement bizarre" :). Je pense que cela devrait être traité comme une curiosité destinée aux environnements non-UNIX et aux très très anciennes versions d'UNIX.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:
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
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:appelle (testé) l'interprète correct sur mon non-exécutable
python
et mesbash
scripts.Explication
#!
et utilise le reste pour appeler l'interprète.PermissionError
soit unFileNotFoundError
.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.)
la source
Vous pouvez y parvenir avec un script comme celui-ci:
Ainsi:
Je recommande de ne pas faire cela. Les autorisations sont là pour une raison. Ceci est un programme pour subvertir les autorisations.
Notez que la gestion de shebang est une fonction du noyau (dans le code source Linux -
fs/binfmt_script.c
). Fondamentalement, le processus invoquant directement un script ne connaît pas le#!
- le noyau l'utilise pour déterminer s'il doit lancer un interpréteur.la source