使用gtar将额外文件添加到现有存档时,循环会过早终止或挂起。它也会在创建初始tar.gz文件后终止。
但是,如果我从循环中删除了gtar调用并将print语句放在它们的位置,则循环按预期执行。有人知道为什么吗? 下面是循环中包含的代码。
if (-e "flex_$yearA"."_"."$monthA.tar.gz")
{ print"accessing Flex tar \n";
exec "gtar --append --file=flex_$yearA"."_"."$monthA.tar.gz $FILE";
}
else
{ print "creating Flex Tar \n ";
exec "gtar -cvsf flex_$yearA"."_"."$monthA.tar.gz $FILE";
}
答案 0 :(得分:5)
你想要“系统”,而不是“exec”。这是一个更清洁的版本:
my $tarball = "flex_${yearA}_${monthA}.tar.gz";
if ( -e $tarball ) {
print"accessing Flex tar \n";
my $command = "gtar --append --file=$tarball $FILE";
system($command) == 0
or die "Could not ($command): $?";
}
else{
print "creating Flex Tar \n ";
my $command = "gtar -cvsf $tarball $FILE";
system($command) == 0
or die "Could not ($command): $?";
}
但是,我想知道所有这些变量来自哪里。你可能会在这里暴露一个严重的安全漏洞有关将列表传递给系统(更安全)的更多信息,请阅读“perldoc -f system”。
答案 1 :(得分:2)
* exec LIST
* exec PROGRAM LIST
exec函数执行系统命令并且永远不会返回 - 如果要返回,请使用system而不是exec。它失败并且仅当命令不存在时返回false并且它是直接执行而不是通过系统的命令shell执行(见下文)。
因此,总之,使用系统或反引号`。 Exec将脚本的执行替换为另一个脚本。
这应该可以正常工作。
if (-e "flex_$yearA"."_"."$monthA.tar.gz")
{ print"accessing Flex tar \n";
system "gtar --append --file=flex_$yearA"."_"."$monthA.tar.gz $FILE";
}
else
{ print "creating Flex Tar \n ";
system "gtar -cvsf flex_$yearA"."_"."$monthA.tar.gz $FILE";
}