in reply to Re: How to pass data as STDIN to Capture::Tiny
in thread How to pass data as STDIN to Capture::Tiny
Hi Ken,
Just to pick up on what the AM mentioned: properly closeing a piped open is important so one can catch all possible errors (as opposed to closeing regular files, where in my experience things go wrong much less often). I see you used autodie, but as far as I can tell it doesn't catch errors when the filehandle is implicitly closed when it goes out of scope.
In your code, if I replace the command with something that returns a nonzero exit code, and add the close at the end of the sub, I get confusing results: inside of capture, the error doesn't seem to get caught at all, and outside of capture, I get the confusing error message "Can't close(GLOB(0x8e2b62)) filehandle: '' at ...". (In fact, if I remember correctly, strange interactions with autodie and piped opens is one of the reasons I started avoiding autodie.)
So here's the same run_external_command code, without autodie but with the minimum error handling:
my $extcmd = 'cat'; open my $cmd_pipe, '|-', $extcmd or die "open $extcmd: $!"; print $cmd_pipe "password\n"; close $cmd_pipe or die "close $extcmd: ".($! ? $! : "\$?=$?");
However, nowadays I very much prefer to use more better-suited modules, one of my favorites is IPC::Run3. For the OP:
use IPC::Run3 'run3'; my $stdin = "password\n"; my @extcmd = ('cat'); run3 \@extcmd, \$stdin, \my $stdout, \my $stderr or die "run3 failed"; $? and die "run3: \$?=$?"; print "stdout: <<$stdout>>\n"; print "stderr: <<$stderr>>\n";
Regards,
-- Hauke D
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: How to pass data as STDIN to Capture::Tiny
by kcott (Archbishop) on Jan 03, 2017 at 06:22 UTC | |
by haukex (Archbishop) on Jan 03, 2017 at 14:17 UTC |