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

时间:2015-03-17 19:22:10

标签: perl

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

我这样做:

exec $ENV{SHELL};

请帮忙。

2 个答案:

答案 0 :(得分:0)

取决于你想做什么。

我认为你所追求的是回归``

查看http://perldoc.perl.org/perlop.html#%60STRING%60,其中有一些关于如何捕获外部命令输出的好例子。请注意,反引号会进行分叉。

我喜欢使用Perls引用,例如运算符qx来代替反引号。

http://perldoc.perl.org/perlop.html#Quote-Like-Operators

示例:

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。

答案 1 :(得分:0)

我认为你在寻找的是

use strict;
use warnings;

open my $fh, '|-', $ENV{SHELL};
print $fh <<'EOF';
echo "$0: From shell goes hell"
EOF

注意'周围'EOF'禁用shell脚本的Perl插值,但$0由shell插入。您将不得不以\$0转义以获取shell可执行文件。有关详细信息,请参阅perlop Here-document

您也可以将现有的文件句柄用于此目的

use strict;
use warnings;

close STDIN;
open STDIN, '<&', \*DATA;
exec $ENV{SHELL};
__DATA__
echo "$0: From shell goes hell"

注意open my $fh, '|-', $ENV{SHELL};只是open my $fh, '|-' or exec $ENV{SHELL};的语法糖,其中open my $fh, '|-'是某些pipeclosedup,{{的语法糖1}}玩杂耍。

但是这段代码不起作用

fork