Le contenu de cet article ne s'applique pas du tout à Windows.
Confirmé avec Linux (Debian stretch) / macOS (10.14).
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?
$ cat lsscript
ls
Ruby
ruby -e 'p IO.popen(["./lsscript"]).read'
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
python -c 'import subprocess;subprocess.check_call(["./lsscript"])'
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 ()
perl -e 'print system("./lsscript","dummy")'
doio.c Perl_do_aexec5 Essayez execvp.
PHP
php -r 'pcntl_exec("./lsscript");'
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))
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.