让Perl返回正确的退出代码

Dav*_*ave 12 perl

我在Ubuntu 11.04上使用Perl 5.10.1.我希望Perl执行shell脚本并使用shell脚本退出的相同代码退出.但这对我不起作用......

    system($runCmd) or die("Failed to run \"$runCmd\": $!");
Run Code Online (Sandbox Code Playgroud)

我已经确认运行"$ runCmd"本身会返回退出代码255,但不会调用"die"子句.如何使用正确的代码退出或至少针对非成功代码失败?

另一个小要求是我希望$ runCmd的输出打印到屏幕上.

小智 11

如上所述perldoc -f die,die没有给出特定的退出代码(只有非零退出代码).为了得到你想要的东西,你需要这样的东西:

my $exit_code=system($runCmd);

if($exit_code!=0)
{
  print "Command $runCmd failed with an exit code of $exit_code.\n";
  exit($exit_code >> 8);
}
else
{
  print "Command $runCmd successful!\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 从`system()`返回的值是一个整数,它对子进程的退出值进行编码,加上指示子进程如何退出的标志(正常终止,被信号杀死等)传递给`exit()的值.只是退出值. (3认同)
  • 程序/ bin/false以退出值1退出.但是`perl -e'打印系统("/ bin/false")'`打印256. (2认同)
  • @musicKk我只是指出`system()`返回的值是你传递给`exit()`的值的256倍. (2认同)

Lin*_*een 9

如果system返回255,则需要and有条件的.

system成功执行后返回零.此外,die还将修改脚本的退出代码.而是warn返回最后一个退出代码,如下所示:

system($cmd) and do {
    warn "Failed to run $cmd. Exit code is $?";
    exit $? >> 8;
};
Run Code Online (Sandbox Code Playgroud)

为了捕获程序的输出,请使用反引号(`)运算符:

my $output = `$cmd`;

if ($?) {
   warn ...;
   exit $? >> 8;
}
Run Code Online (Sandbox Code Playgroud)

反引号操作符仅捕获STDOUT,因此对于要捕获的所有错误消息(通常转到STDERR),修改$cmd并附2>&1加到它.

注意$?全局右移八位.


积分转到@musiKk:关于system()如何正确检索实际退出状态的perl文档.

  • 只是一个补充:你必须将`system`的返回值向右移八,才能得到`$ cmd`的返回值.(http://perldoc.perl.org/functions/system.html) (3认同)

tch*_*ist 6

  system($runCmd) or die("Failed to run \"$runCmd\": $!");
Run Code Online (Sandbox Code Playgroud)

与大多数Perl函数不同,system成功时返回false,失败时返回true.这完全是我所知道的倒退,但事实就是如此.

你需要"system()和"not"system()或".你可能$?不想要$!,虽然这有时候很棘手.

我有一个小小的厌恶

system(...)                           && die
Run Code Online (Sandbox Code Playgroud)

因为它搞砸了|| die通常在右边连续垂直双边缘的所有其余部分,我有时会写

system(...) == 0                      || die
Run Code Online (Sandbox Code Playgroud)

这样他们就可以再次排队了.