Pergunta

Ao usar gtar para adicionar arquivos extras a um arquivo existente, o loop termina prematuramente ou trava. Ele também termina após criar o arquivo tar.gz inicial.

No entanto, se eu remover as chamadas gtar do loop e colocar instruções de impressão em seu lugar em vez disso, as executa laço como esperado. Alguém sabe por que isso é? Abaixo está o código contido dentro do loop.

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"; 
}
Foi útil?

Solução

Você quer "sistema", não "exec". Aqui está uma versão mais limpa:

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

No entanto, eu estou querendo saber onde todas essas variáveis ??vêm. Você pode expor uma falha de segurança séria aqui. Leia "sistema perldoc -f" para obter mais informações sobre como passar uma lista para sistema (mais seguro).

Outras dicas

* exec LIST

* exec PROGRAM LIST

A função exec executa um comando do sistema e nunca sistema de uso returns-- em vez de exec se você quer que ele voltar. Ele falha e somente se o comando não existe retornos falsos e é executado diretamente em vez de através de shell de comando do seu sistema (veja abaixo).

Assim, em conclusão, o sistema de uso ou backticks `. Exec substitui a execução do seu script com outro.

Isso deve funcionar como desejado.


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


Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top