即使在成功执行后,Perl系统函数也会返回-1

时间:2018-03-28 15:35:20

标签: perl return system return-code

我在第三方perl脚本中遇到了一些奇怪的情况。为了证明:

my $rc = system("tar -C /app/src -xvf /app/package.tar.gz");

if ($rc != 0)
{
   print "Return code: $rc";  
}

直接在shell上运行tar -C /app/src -xvf /app/package.tar.gz即可,echo $?显示退出状态0。都好。

此外,在运行此小型perl代码段时,返回始终 -1。如果我尝试这样的话:

my $rc = system("ls");

if ($rc != 0)
{
   print "Return code: $rc";  
} 

...返回码也是-1

我对perl的了解不多,所以我想知道什么可能触发这种行为。

文档没有特别提及(http://perldoc.perl.org/functions/system.html)。

解决方案:

获取$!以获取有关错误的更多详细信息:

my $rc = system("tar -C /app/src -xvf /app/package.tar.gz");

if ($rc != 0)
{
   print "Return code: $rc\n";
   print "Reason: $!";  
}

返回:

Return code: -1
Reason: No child processes

应用$SIG{'CHLD'} = 'DEFAULT';解决了问题:

$SIG{'CHLD'} = 'DEFAULT';

my $rc = system("tar -C /app/src -xvf /app/package.tar.gz");

if ($rc != 0)
{
   print "Return code: $rc\n";
   print "Reason: $!";  
}

一些细节来自: What's the difference between various $SIG{CHLD} values?

1 个答案:

答案 0 :(得分:4)

在您链接到的文档中(强调我的):

  

-1 的返回值表示无法启动程序或wait(2)系统调用错误(检查$!原因)。