Der Inhalt dieses Artikels gilt überhaupt nicht für Windows.
Bestätigt mit Linux (Debian Stretch) / MacOS (10.14).
Laut https://linuxjm.osdn.jp/html/LDP_man-pages/man3/exec.3.html usw. hat nur execvp die Funktion, ENOEXEC als Shell-Skript zu interpretieren, wenn es auftritt. Funktioniert diese Funktion, wenn ich ein externes Programm in einer Skriptsprache ohne Shell ausführe?
$ cat lsscript
ls
Ruby
ruby -e 'p IO.popen(["./lsscript"]).read'
process.c proc_exec_cmd Versuchen Sie es mit execve, add / bin / sh für ENOEXEC und versuchen Sie es erneut
Python
--Direkte Ausführung (Beispiel): Das Argument von check_call (usw.) ist ein Array
python -c 'import subprocess;subprocess.check_call(["./lsscript"])'
Modules/_posixsubprocess.c child_exec Versuchen Sie es mit execve. ** Fehler bei ENOEXEC **
Gleiches gilt für Python 3. Wenn shell = True ist, schlägt dies nicht fehl, aber pipes.quote und shlex.quote sind erforderlich. (Wenn Sie diesen Artikel lesen, wissen Sie, dass dies erforderlich ist.)
Perl
perl -e 'print system("./lsscript","dummy")'
doio.c Perl_do_aexec5 Versuchen Sie es mit execvp.
PHP
php -r 'pcntl_exec("./lsscript");'
ext/pcntl/pcntl.c pcntl_exec Versuchen Sie es mit execve. ** Fehler bei ENOEXEC **
(Da es sich bei dem oben genannten um exec handelt, müssen Sie fork usw. aufrufen, um es zu einem Unterprozess zu machen. Es gibt ein Standard-Ausführungssystem, das diese Seite in ext / standard / exec.c nicht benötigt, aber es scheint auf popen fixiert zu sein (dh eine Shell ist immer enthalten).)
Wenn ich versuche, es in Python / PHP auszuführen, ohne die Shell zu durchlaufen, wird sh nicht automatisch hinzugefügt. Bitte seien Sie vorsichtig, wenn Sie [C-Sprache shebang-like] werfen (https://qiita.com/cielavenir/items/6063c117f25f9188b84c).