Hi Peter,
Thanks for your reply.

On 2 Mar 2012 02:48:28 -0000
Peter Scott <pe...@psdt.com> wrote:

> 
> It doesn't have flaws.  You could do it without the module with a
> piped open:
> 
> sub run_cmd
> {
>   my $cmd = shift;
> 
>   open my $fh, '-|', "$cmd 2>&1" or die "open: $!";
>   print while <$fh>;
>   close $fh;
>   return $? >> 8;
> }
> 

Thanks for your reply. I previously tried open as well but I was unable
to get a return code back. Your solution gives the return code back.
The only thing I have to do is to check if the executable will be found
in the PATH.

I tried out all 3 solutions like this:

<--------------------------------snip------------------------>
#! /usr/bin/perl

use strict;
use warnings;
use 5.010;
use IPC::Open3;

use File::Which;

# one good cmd, one with an invalid parameter, and one not to be found
my @cmds = ( "uname -a", "uname -aarst", "unamre -a");

foreach ( @cmds ) { say run_cmd1($_); };
foreach ( @cmds ) { say run_cmd2($_); };
foreach ( @cmds ) { say run_cmd3($_); };

exit;


sub run_cmd1 {
  my $cmd = shift @_;

  print "Issuing [$cmd]\n";
  my $pid = open3(undef, *CMD_OUT, *CMD_OUT,$cmd);

  print while <CMD_OUT>;
  waitpid($pid,0);
  return $? >>8;
}

sub run_cmd2 {
  my $cmd = shift;

  print "Issuing [$cmd]\n";
  return 1 if ( not is_executable($cmd));
  open my $fh, '-|', "$cmd 2>&1" or die "open: $!";
  print while <$fh>;
  close $fh;
  return $? >> 8;
}

sub run_cmd3 {
  my $cmd = shift @_;

  print "Issuing [$cmd]\n";
  return 1 if ( not is_executable($cmd));

  open(CMD,"$cmd 2>&1|") or die "Can't run $cmd $cmd!";
  print while <CMD>;
  return $? >> 8;
}


sub is_executable {
  my $cmd = shift @_;

  my ($cname,undef) = split /\s+/, $cmd;
  $cname = which($cname);
  if ( not defined $cname ) {
        say "$cmd not found or not executable.";
        return 0;
  }
  return 1;
}

<--------------------------------snap------------------------>


But I get those errors which confuse me.
Use of uninitialized value $cmd in concatenation (.) or string
at ./testcmd2.pl line 34, <CMD_OUT> line 4. 
Issuing []

and more of these. 

What is going on here? I assume that I made a typical beginner's
mistake but do not see where.

Another question I have: Where do I find what '-|' means? I mean the
minus before the pipe char.



-- 
Manfred







-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to