从perl脚本启动新shell,并在子shell上执行其余代码

从perl脚本启动新shell,并在子shell上执行其余代码,perl,Perl,我想从perl开始一个新的shell(我通过exec语句来实现)。当子shell启动时,我希望在新shell上打印一些消息,并希望在子shell上运行另一个perl脚本 我正在这样做: exec $ENV{SHELL}; 请帮助。取决于您想做什么 exec()将返回而不显示输出/状态,并且不会分叉 system()将从Perl进程分叉并返回一个状态(exitcode) 我想你想要的是回来`` 看看哪一个有一些关于如何捕获外部命令输出的好例子。请注意,backticks不使用fo

我想从perl开始一个新的shell(我通过
exec
语句来实现)。当子shell启动时,我希望在新shell上打印一些消息,并希望在子shell上运行另一个perl脚本

我正在这样做:

exec $ENV{SHELL};

请帮助。

取决于您想做什么

  • exec()将返回而不显示输出/状态,并且不会分叉
  • system()将从Perl进程分叉并返回一个状态(exitcode)
我想你想要的是回来``

看看哪一个有一些关于如何捕获外部命令输出的好例子。请注意,backticks不使用fork

我喜欢使用Perls引号,比如operator
qx
来代替backticks

示例:

my $ls = qx/ls/;
my $ret_ls = $? >> 8;

print "Output: $ls\nExit Code: $ret_ls";
my $other_script_output = qx{/path/to/other_script.pl};
my $ret_other_script = $? >> 8;

print "Output: $other_script_output\nExit Code: $ret_other_script";
其他脚本示例:

my $ls = qx/ls/;
my $ret_ls = $? >> 8;

print "Output: $ls\nExit Code: $ret_ls";
my $other_script_output = qx{/path/to/other_script.pl};
my $ret_other_script = $? >> 8;

print "Output: $other_script_output\nExit Code: $ret_other_script";

如果您希望以编程方式与该流程交互,那么您将进入open2/open3。

我认为您需要的是

use strict;
use warnings;

open my $fh, '|-', $ENV{SHELL};
print $fh <<'EOF';
echo "$0: From shell goes hell"
EOF
注意
打开我的$fh,“|-”,$ENV{SHELL}
只是
打开我的$fh,“|-”或exec$ENV{SHELL}的语法糖其中,
打开我的$fh,“|-”
是一些
管道
关闭
重复
叉子
杂耍的语法糖

但是这个代码不起作用

use strict;
use warnings;

my $script = <<'EOF';
echo "$0: From shell goes hell"
EOF

close STDIN;
open STDIN, '<', \$script; # this is not real file handler!
exec $ENV{SHELL};
使用严格;
使用警告;

my$script=显示如何使用“exec语句”。e、 g.展示你尝试过的东西(您可以编辑您的问题)不会有带有
exec
的子shell(子shell仅由fork()创建)。您的perl脚本将被您执行的任何程序所取代。恰当的术语应该是执行壳。请您重新表述您的问题,以便我们更好地理解它。请在执行包含simple exec$ENV{SHELL}的perl脚本之前和之后检查ps命令的输出。它实际上会创建一个子shell