[Cascavel-pm] Duvida com exec

Luis Motta Campos luismottacampos em yahoo.co.uk
Terça Agosto 12 22:25:18 PDT 2008


Agustinho Coelho wrote:
> 
>> RTFM:
>>
>>        exec LIST
>>        exec PROGRAM LIST
>>                The "exec" function executes a system command and never 
>> returns-- use "system" instead of "exec" if you
>>                want it to return.  It fails and returns false only if 
>> the command does not exist and it is executed
>>                directly instead of via your system's command shell 
>> (see below).
>>
>> []s,
>> Russo
> 
> Russo,
> 
> Eu li o manual e já tinha tentado antes do exec() usar o system() de 
> diversas maneiras mas sem conseguir o efeito desejado. Achava que 
> justamente por não retornar uma saída ele fosse mais simples. Segue o 
> código como estava com o system() (seguindo exemplo do próprio perldoc):
> 
> #/usr/bin/perl -w
> 
> use strict;
> use warnings;
> 
> my @ping = ("ping" , "-c4" , "192.168.0.222" , " " , "\>" , " " , 
> "/dev/null\>2\&1");
> my @mailup = ("sendmail" , "-f" , "user\@host.com.br" , "-t" , 
> "user\@host.com.br" , " " , "\<" , " " , "/home/bkpuser/netmailup.txt");
> my @maildown = ("sendmail" , "-f" , "user\@host.com.br" , "-t" , 
> "user\@host.com.br" , " " , "\<" , " " , "/home/bkpuser/netmaildown.txt");
> 
> system (@ping);
> 
> if ( $? == 0 ) {
>        system (@mailup);
> } else {
>        system (@maildown);
> }
> 
> Eu tentei escapar todos os caracteres duvidosos, tentei interpolar de 
> várias maneiras, mas sem sucesso algum. Ele sempre apresenta os 
> seguintes erros:
> *sh: 1: command not found* ou *ping: unknown host >
> *

Mamma mia, nem posso acreditar. Alguém que tentou tratar erros do system().

Parabéns, Daniel. A única coisa que você não fez certo é esperar que o 
system() incorpore a tua variável de ambiente PATH. Não tem PATH setado 
quando você executa system, esta é a regra (sim, pode haver path, mas 
isso é excessão).

Assim, você precisa passar caminho completo para todos os comandos que 
executar:

   __PERL__
   my @ping = ("ping" , "-c4" , "192.168.0.222" );
   if ($? == -1) {
     print "failed to execute: $!\n";
   }
   elsif ($? & 127) {
     printf "child died with signal %d, %s coredump\n",
       ($? & 127),  ($? & 128) ? 'with' : 'without';
   }
   else {
     printf "child exited with value %d\n", $? >> 8;
   }

   Repare em como eu trato erros de ping.

   Agora, sério: se você vai "pingar" uma máquina, use o Net::Ping. E, 
se pretende mandar emails, use Mail::Send ou seu módulo de SMTP 
favorito... tenho certeza de que bastante gente aqui pode te dar boas 
indicações.

   Putamplexos.
-- 
Luis Motta Campos is a software engineer,
Perl Programmer, foodie and photographer.


Mais detalhes sobre a lista de discussão Cascavel-pm