为什么exec-ing gtar会挂起我的Perl程序?

时间:2009-02-05 11:37:25

标签: perl unix gzip

使用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"; 
}

2 个答案:

答案 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"; 
}