【发布时间】:2025-12-18 16:50:01
【问题描述】:
我在使用 3rd 方 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 sn-p 时,返回总是 -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?
【问题讨论】:
-
我可以想象第一种情况的问题,但第二种情况很奇怪。你在什么系统上?您的 Perl 程序是否正常运行 - 或者这是您尝试的第一个?如果您将输出重定向到一个文件(
system('ls > ls.txt')或类似的文件),之后您会得到正确的文件吗?如果你改用反引号,my $ret = qx(ls);你会在$ret中得到什么? -
$SIG{CHLD}的值是多少?为什么localized 的值没有变化? -
@choroba “为什么没有本地化值更改?”是什么意思? $SIG{CHLD} 以前未定义,默认为
IGNORE(据我了解文档)。 -
啊,好的。剩下的问题是为什么 Perl 无法 wait() 获取
system。 -
很高兴您对其进行了深入研究并进行了更新,但请注意,这根本不能解释您在第二个 sn-p 中报告的奇怪行为。安装信号处理程序(默认情况下!)“修复”它的事实是很好的诊断,但那里有一些严重的问题。
标签: perl return system return-code