1

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

2 に答える 2

5

「exec」ではなく「system」が必要です。よりクリーンなバージョンは次のとおりです。

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 関数はシステム コマンドを実行し、戻りません。戻りたい場合は、exec の代わりに system を使用します。コマンドが存在せず、システムのコマンド シェルを介してではなく直接実行された場合にのみ失敗し、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 に答える