[Cascavel-pm] Re: Digest Cascavel-pm, volume 27, assunto 4

Graciliano M. P. gmpowers em terra.com.br
Domingo Janeiro 25 15:46:38 CST 2004


Alceu,

A saída STDERR e STDOUT são apenas do processo do interpretador Perl. Ou
seja, apenas quando vc dá

  print "" ;
  print STDER "" ;
  print STDOUT "" ;
  ...

Já o programa externo que vc está tentando executar, tem o seu próprio
processo e suas saídas. Ou seja, redirecionar o STDERR não irá influenciar
em nada as saídas do programa externo.

A melhor maneira para executar um comando e capturar a sua saída é
utilizando IPC::Open3:

  use IPC::Open3 ;

  open3(LOGREAD , LOGERROR, LOGWRITE, "dir *");
  my @log = (<LOGREAD> , <LOGERROR>) ;
  close(LOGREAD , LOGERROR, LOGWRITE) ;

  my $log = join ("", @log) ;

  print "-----------\n" ;
  print "$log\n" ;
  print "-----------\n" ;

Detalhe, no Windows é mesmo complicado capturar a saída de um programa, pois
existem várias variações de executáveis em console, o que faz a captura pelo
Perl não funcionar em todos.

Em última instância execute redirecionando a saída para um arquivo
utilizando "> out.log", mas nem sempre a saída de erro é redirecionada para
o arquivo:

  open3(LOGREAD , LOGERROR, LOGWRITE, " COMANDO >out.log ");

Caso não funcione (em Win32), utilize os recursos dos módulos Win32::.
Certamente tem algum módulo para execúção apenas para Win32.

Atenciosamente,
Graciliano M. P.

> Olá gente,
>
> Estou com uma dúvida de arrancar os cabelos...
>
> Imaginem que quero executar comandos através do Perl, sem usar o shell, e
capturando a saída padrão e saída de erro e ainda usando o modo Taint.
>
> Então fiz assim:
> --
>
> #!/usr/bin/perl -T
>
> open STDERR, ">&STDOUT" or die "impossível duplicar STDOUT: $!\n";
>
> open(OUT,"-|") or exec ("/usr/bin/programa argumentos");
>
> while(<OUT>) {
>
> (algum processamento com o conteúdo lido DE STDERR E STDOUT)...
>
> }
>
> close(OUT);
>
> --
>
> Quando executo, a saída do STDERR é "cuspida" para o shell, e o loop com
<OUT> nunca chega a acontecer, porque <OUT> é vazio...
>
> Se eu incluir algo assim:
>
> open STDOUT,">out.tmp";
>
> Toda a saída, de STDERR e STDOUT vai para o arquivo texto. Mas o pipe (-|)
não consegue capturar coisa alguma de STDOUT, quando o faria normalmente.
Alguém consegue dizer por quê?
>
> Eu fiz um teste e sei que dá para usar IPC::Open3 para fazer a mesma
coisa, só que gerenciar STDERR e STDOUT é bastante complicado usando esse
módulo.
>
> Alguém conhece alguma outra forma menos dolorosa?
>





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