在我全新安装的 Debin 中,默认安装了 perl intepreter(换句话说,我还没有其他 perl 软件包)。但是,尝试这样做:
$ls
a.cpp b.cpp
$ perl -e 'system "g++ -o a.out a.cpp b.cpp"; exec "a.out"'
没有输出(没有错误,什么也没有)。 Perl 正确使用了该system
命令(即,它创建了a.out
可执行文件),但无法分叉它。为什么?
答案1
答案就在的文档exec
但如果您不知道自己在寻找什么,就很难看到。
如果 LIST 中有多个参数,则会调用 execvp(3) 使用 LIST 中的参数。如果 LIST 中只有一个元素,则检查参数是否有 shell 元字符,如果有,则将整个参数传递到系统的命令 shell 进行解析 (...)。如果参数中没有 shell 元字符,则将其拆分为单词并直接传递给 execvp(……)。
在所有情况下,命令名称都受路径查找(通过 Perl 或 shell):如果它不包含/
,则在命令搜索路径 ( ) 中查找$PATH
,该路径通常不包含当前目录。
改成
exec "./a.out"
答案2
...但不能分叉它
exec
根本不分叉,而是用新代码(a.out)替换当前运行的应用程序代码(即 perl)。
除此之外,还不清楚预期会产生什么输出a.out
,即问题可能出在perl 上a.out
,而不是 perl 上。
也可能是系统根本不在a.out
本地目录中查找二进制文件,因为PATH
环境变量没有显式包含.
.要强制执行,请exec "./a.out"
改为执行。