Frage

Wenn gtar mit zusätzlichen Dateien zu einem existierenden Archiv hinzuzufügen, wird die Schleife beendet vorzeitig oder hängt. Es endet auch nach der anfänglichen tar.gz-Datei zu erstellen.

Allerdings, wenn ich die gtar Anrufe aus der Schleife entfernen und stattdessen print-Anweisungen an ihre Stelle gesetzt, führt die Schleife, wie erwartet. Weiß jemand, warum das so ist? Im Folgenden wird der Code innerhalb der Schleife enthalten ist.

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"; 
}
War es hilfreich?

Lösung

Sie wollen "System", nicht "exec". Hier ist eine sauberere Version:

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

Allerdings frage ich mich, wo all diese Variablen kommen. Sie könnten eine ernsthafte Sicherheitslücke hier aus. Lesen "perldoc -f System" für weitere Informationen über eine Liste System vorbei (sicherer).

Andere Tipps

* exec LIST

* exec PROGRAM LIST

Die exec-Funktion führt einen Systembefehl und nie returns-- Verwendung System statt exec, wenn Sie es zurückgeben möchten. Es schlägt fehl und gibt nur falsch, wenn der Befehl nicht existiert und es ausgeführt wird, sondern direkt über Kommando-Shell Ihres Systems (siehe unten).

So, zum Schluss, Use-System oder Backticks `. Exec ersetzt die Ausführung des Skripts mit einem anderen.

Dies sollte wie gewünscht funktionieren.


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


Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top