Perl system()调用使用哪个shell?

Laz*_*zer 10 shell perl system

我正在使用系统调用来完成一些任务

system('myframework mycode');
Run Code Online (Sandbox Code Playgroud)

但它抱怨缺少环境变量.那些环境变量是在我的bash shell中设置的(从那里我运行Perl代码).

我究竟做错了什么?

system调用是否创建了一个全新的shell(没有环境变量设置)?我怎么能避免这种情况?

mkb*_*mkb 18

情况很复杂.Perl不一定会调用shell.Perldoc说:

如果只有一个标量参数,则检查参数是否为shell元字符,如果有,则将整个参数传递给系统的命令shell进行解析(这在Unix平台上是/ bin/sh -c,但在其他平台).如果参数中没有shell元字符,则将其拆分为单词并直接传递给execvp,这样效率更高.

所以它实际上看起来你会将参数传递给execvp.此外,shell是否加载了.bashrc,.profile或.bash_profile取决于shell是否是交互式的.可能它不是,但你可以像这样检查.


gle*_*man 5

如果您不想调用 shell,请system使用列表调用:

system 'mycommand', 'arg1', '...';
system qw{mycommand arg1 ...};
Run Code Online (Sandbox Code Playgroud)

如果你想要一个特定的 shell,请显式调用它:

system "/path/to/mysh -c 'mycommand arg1 ...'";
Run Code Online (Sandbox Code Playgroud)