简单的问题,但我找不到一个好的答案 - 这里有一个例子:
“world.pl”在子节点中生成“hello.pl”并处理其标准输出。 “world.pl”需要知道“hello.pl”的退出状态。进行系统调用不是一种选择,因为“world.pl”需要处理“hello.pl”的标准输出。我也试图避免fork()。问题:“world.pl”如何找到“hello.pl”的退出状态?如果重要的话,在达尔文上使用perl v5.12.4。提前谢谢, - M。
#!/opt/local/bin/perl -w
## hello.pl <name> [more names]
exit 1 if ($#ARGV < 0);
foreach (@ARGV) { print "Hello, $_\n" }
exit 0;
另一部分......
#!/opt/local/bin/perl -w
## world.pl name [more names ...]
open (FP, "./hello.pl @ARGV |") or die "$0: Cannot open pipe: $!\n";
while (<FP>) { print }
close FP;
my $status = 0; # Want this to be exit status of the process "hello.pl"
exit $status;
答案 0 :(得分:4)
my $status = $?;
但是你无法跟进
exit $status;
因为数字太大了。我见过人们做了以下事情,但它标志着一些失败的成功。
exit( $status >> 8 ); # XXX BAD!
我建议bash
做什么:
exit( ($status & 0x7F) ? ($status & 0x7F) | 0x80 : $status >> 8 );
顺便说一句,您无法正确构建shell命令。
$ world.pl 'von Perl' meow
Hello, von
Hello, Perl
Hello, meow
使用String :: ShellQuote或使用open |-
的多个arg形式。
open (FP, '|-', './hello.pl', @ARGV)
使用修复:
$ world.pl 'von Perl' Meow
Hello, von Perl
Hello, Meow