Domanda

Quando si utilizza gtar per aggiungere altri file a un archivio esistente, il ciclo termina prematuramente o si blocca. Termina anche dopo aver creato il file tar.gz iniziale.

Tuttavia, se tolgo le chiamate gtar dal ciclo e mettere dichiarazioni di stampa al loro posto, invece, il ciclo viene eseguito come previsto. qualcuno sà perche è cosi? Qui di seguito è il codice contenuto all'interno del ciclo.

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"; 
}
È stato utile?

Soluzione

Si vuole "sistema", non "exec". Ecco una versione più pulita:

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

Tuttavia, mi chiedo dove tutte quelle variabili provengono da. Si potrebbe esporre un grave buco di sicurezza qui. Leggi "Sistema -f perldoc" per ulteriori informazioni su passare un elenco di sistema (più sicuro).

Altri suggerimenti

* exec LIST

* exec PROGRAM LIST

La funzione exec esegue un comando di sistema e non di sistema uso returns-- invece di exec se si vuole che ritorni. Non riesce e restituisce falso solo se il comando non esiste e viene eseguito direttamente invece che tramite la shell dei comandi del sistema (vedi sotto).

Quindi, in conclusione, il sistema di uso o backticks `. Exec sostituisce l'esecuzione dello script con un altro.

Questo dovrebbe funzionare, se lo desideri.


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


Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top