1

使用 gtar 将额外文件添加到现有存档时,循环会提前终止或挂起。它也会在创建初始 tar.gz 文件后终止。

但是,如果我从循环中删除 gtar 调用并将打印语句放在它们的位置,则循环将按预期执行。有人知道为什么是这样吗?下面是循环中包含的代码。

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"; 
}
4

2 回答 2

5

你想要“系统”,而不是“执行”。这是一个更清洁的版本:

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”以获取有关将列表传递给系统的更多信息(更安全)。

于 2009-02-05T11:50:14.510 回答
2
* exec LIST

* exec PROGRAM LIST

exec 函数执行系统命令并且从不返回——如果您希望它返回,请使用 system 而不是 exec。仅当命令不存在并且直接执行而不是通过系统的命令 shell 执行时,它才会失败并返回 false(见下文)。

所以,总而言之,使用系统或反引号`。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"; 
}


于 2009-02-05T11:40:31.100 回答