Why not adopt me?
NAME
IPC::Run::Fused - Capture Stdout/Stderr simultaneously as if it were one stream, painlessly.
VERSION
version 1.000001
SYNOPSIS
run_fused(
my
$fh
,
$stderror_filled_program
,
'--file'
,
$tricky_filename
,
@moreargs
) ||
die
"Argh $@"
;
open
my
$fh
,
'>'
,
'somefile.txt'
||
die
"NOO $@"
;
# Simple implementation of 'tee' like behaviour,
# sending to stdout and to a file.
while
(
my
$line
= <
$fh
> ) {
$fh
$line
;
$line
;
}
DESCRIPTION
Have you ever tried to do essentially the same as you would in bash do to this:
parentapp <( app 2>&1 )
And found massive road works getting in the way.
Sure, you can always do this style syntax:
open
my
$fh
,
'someapp --args foo 2>&1 |'
;
But that's not very nice, because
- 1. you're relying on a sub-shell to do that for you
- 2. you have to manually escape everything
- 3. you can't use list context.
And none of this is very Modern or Nice
SIMPLEST THING THAT JUST WORKS
This code is barely tested, its here, because I spent hours griping about how the existing ways suck.
FEATURES
- 1. No String Interpolation.
-
Arguments after the first work as if you'd passed them directly to 'system'. You can be as dangerous or as safe as you want with them. We recommend passing a list, but a string ( as a scalar reference ) should work
But if you're using a string, this modules probably not affording you much.
- 2. No dicking around with managing multiple file handles yourself.
-
I looked at
IPC::Run
,IPC::Run3
andIPC::Open3
, and they all seemed very unfriendly, and none did what I wanted. - 3. Non-global file-handles supported by design.
-
All the competition seem to still have this thing for global file handles and you having to use them. Yuck!.
We have a few global file-handles inside our code, but they're only
STDERR
andSTDOUT
, at present I don't think I can circumvent that. If I ever can, I'll endeavor to do so ☺
EXPORTED FUNCTIONS
No functions are exported by default, be explicit with what you want.
At this time there is only one, and there are no plans for more.
run_fused
run_fused(
$fh
,
$executable
,
@params
) ||
die
"$@"
;
run_fused(
$fh
, \
$command_string
) ||
die
"$@"
;
run_fused(
$fh
,
sub
{ .. } ) ||
die
"$@"
;
# Recommended
run_fused(
my
$fh
,
$execuable
,
@params
) ||
die
"$@"
;
# Somewhat supported
run_fused(
my
$fh
, \
$command_string
) ||
die
"$@"
;
$fh will be clobbered like 'open' does, and $cmd, @args will be passed, as-is, through to exec() or system().
$fh will point to an IO::Handle attached to the end of a pipe running back to the called application.
the command will be run in a fork, and STDERR
and STDOUT
"fused" into a singular pipe.
NOTE: at present, STDIN
's file-descriptor is left unchanged, and child processes will inherit parent STDIN
's, and will thus block ( somewhere ) waiting for response.
AUTHOR
Kent Fredric <kentnl@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2017 by Kent Fredric <kentfredric@gmail.com>.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.