他们这样做execl(_PATH_BSHELL, "sh", "-c", command, NULL)
而不是execl(_PATH_BSHELL, command, NULL)
后者不会command
直接执行,而是_PATH_BSHELL
( /bin/sh
)$0
设置为command
并且没有参数,导致 shell 期望来自其标准输入的命令。
此外,该语法依赖于NULL
被定义为显式指针(例如((void*)0)
),而不仅仅是0
,在任何地方都不能保证。虽然他们可以在他们的实现中做到这一点(因为他们控制所有的标题),但这不是你应该在应用程序代码中做的。
不,execl(command, command, (void*)NULL)
也不会command
直接执行,除非command
是a)完整路径和b)以可执行格式(二进制或以 she-bang 开头的脚本#!
- 后者是非标准扩展名)。如果command
是要在其中查找的简单命令名称PATH
(如pwd
or a.out
)或不以 she-bang 开头的可执行脚本,则应该使用execlp
而不是execl
.
这些函数完成了shellexec[lv]p[e]
所做的一些事情(比如查看. 请注意,使用 it's ,而不是用户的登录 shell 或使用的环境。PATH
system(3)
popen(3)
/bin/sh -c
/bin/sh
$SHELL
如果您执行sh -c a.out
而不是仅执行a.out
自身,那么实际a.out
进程是否最终成为“孙”进程而不是子进程?
只有一些像dash
. 不使用bash
, ksh93
, mksh
, zsh
, yash
,busybox
等,它将a.out
直接执行而不是分叉并等待它。