2009-02-05 5 views
1

Lorsque vous utilisez gtar pour ajouter des fichiers supplémentaires à une archive existante, la boucle se termine prématurément ou se bloque. Il se termine également après la création du fichier tar.gz initial.Pourquoi exec-gtar bloque-t-il mon programme Perl?

Cependant, si je supprime les appels gtar de la boucle et place les instructions print à leur place, la boucle s'exécute comme prévu. Est-ce que quelqu'un sait pourquoi c'est comme ça? Voici le code contenu à l'intérieur de la boucle:

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

vous devriez marquer une réponse – Geo

Répondre

5

Vous voulez "système", pas "exec". Voici une version plus propre:

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): $?"; 
} 

Cependant, je me demande d'où viennent toutes ces variables. Vous pourriez exposer un trou de sécurité sérieux ici. Lisez "système perldoc -f" pour plus d'informations sur la transmission d'une liste au système (plus sûr).

2
* exec LIST 

* exec PROGRAM LIST 

La fonction exec exécute une commande de système et de ne jamais utiliser le système d'returns-- au lieu de exec si vous voulez revenir. Il échoue et renvoie false uniquement si la commande n'existe pas et est exécutée directement au lieu de via le shell de commande de votre système (voir ci-dessous).

Donc, en conclusion, le système d'utilisation ou `contre-apostrophes. Exec remplace l'exécution de votre script par une autre.

Cela devrait fonctionner comme vous le souhaitez.

 

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

 
Questions connexes