[RUBY] Langages qui reviennent aux scripts shell lorsqu'un programme externe est exécuté directement

Selon https://linuxjm.osdn.jp/html/LDP_man-pages/man3/exec.3.html etc., seul execvp a une fonction pour interpréter ENOEXEC comme un script shell lorsqu'il se produit. Cette fonctionnalité fonctionnera-t-elle si j'exécute un programme externe dans un langage de script sans shell?

Préparation

$ cat lsscript
ls

Courir

Ruby

process.c proc_exec_cmd Essayez execve, ajoutez / bin / sh pour ENOEXEC et réessayez

Python

--Exécution directe (exemple): l'argument de check_call (etc.) est un tableau

Modules/_posixsubprocess.c child_exec Essayez d'exécuter. ** Échec pour ENOEXEC **

La même chose est vraie pour Python 3. Si shell = True, cela n'échouera pas, mais pipes.quote et shlex.quote sont requis. (Si vous êtes un lecteur de cet article, vous en connaissez la nécessité)

Perl

--Exécution directe (exemple): deux éléments ou plus de l'argument system ()

doio.c Perl_do_aexec5 Essayez execvp.

PHP

ext/pcntl/pcntl.c pcntl_exec Essayez d'exécuter. ** Échec pour ENOEXEC **

(Comme ce qui précède est exec, vous devez appeler fork etc. pour en faire un sous-processus. Il existe un système d'exécution standard dans ext / standard / exec.c qui n'a pas besoin de ce côté, mais il semble être corrigé pour popen (c'est-à-dire qu'un shell est toujours inclus))

Conclusion

Lorsque j'essaye de l'exécuter en Python / PHP sans passer par le shell, sh n'est pas ajouté automatiquement. Soyez prudent lorsque vous lancez C language shebang-like.

Recommended Posts

Langages qui reviennent aux scripts shell lorsqu'un programme externe est exécuté directement
Créons une spécification externe facile à gérer