NAME
IPC::Run3 - Run a subprocess in batch mode (a la system) on Unix, Win32, etc.
SYNOPSIS
use IPC::Run3; ## Exports run3() by default
use IPC::Run3 (); ## Don't pollute
DESCRIPTION
This module allows you to run a subprocess and redirect stdin, stdout, and/or stderr to files and perl data structures. It aims to satisfy 99% of the need for using system()/qx``/open3() with a simple, extremely Perlish API and none of the bloat and rarely used features of IPC::Run.
Speed (of Perl code; which is often much slower than the kind of buffered I/O that this module uses to spool input to and output from the child command), simplicity, and portability are paramount. Disk space is not.
Note that passing in \undef explicitly redirects the associated file descriptor for STDIN, STDOUT, or STDERR from or to the local equivalent of /dev/null. Passing in "undef" (or not passing a redirection) allows the child to inherit the corresponding STDIN, STDOUT, or STDERR from the parent.
Because the redirects come last, this allows STDOUT and STDERR to default to the parent's by just not specifying them; a common use case.
Note: This means that:
run \@cmd, undef, \$out; ## Pass on parent's STDIN
does not close the child's STDIN, it passes on the parent's. Use
run \@cmd, \undef, \$out; ## Close child's STDIN
for that.
If the exact same value is passed for $stdout and $stderr, then the child will write both to the same filehandle. In general, this means that
run \@cmd, \undef, "foo.txt", "foo.txt";
run \@cmd, \undef, \$out, \$out;
will DWYM and only require one set of reads.
DEBUGGING
To enable debugging use the IPCRUN3DEBUG environment variable to a non-zero integer value:
$ IPCRUN3DEBUG=1 myapp
.
COMPARISON
Here's how it stacks up to existing APIs:
- system(), qx'', open "...|", open "|..."
-
- +
-
redirects more that one file descriptor
- +
-
returns TRUE on success, FALSE on failure
- +
-
throws an error if problems occur in the parent process (or the pre-exec child)
- +
-
allows a very perlish interface to perl data structures
- +
-
allows 1 word invocations to avoid the shell easily.
- -
-
leaves the result in $?
- open2(), open3()
- IPC::Run::run()
-
- +
-
Smaller, lower overhead, simpler, more portable
- +
-
No select() loop
- +
-
Does not fall prey to Perl closure leaks
- -
-
Does not allow interaction with the subprocess (which IPC::Run::run() allows by redirecting subroutines).
- -
-
Lacks many features of IPC::Run::run() (filters, pipes, redirects, pty support).
TODO
pty support
LIMITATIONS
Often uses intermediate files (determined by File::Temp, and thus by the File::Spec defaults and the TMPDIR env. variable) for speed, portability and simplicity.
COPYRIGHT
Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved
LICENSE
You may use this module under the terms of the BSD, Artistic, or GPL licenses, any version.
AUTHOR
Barrie Slaymaker <barries@slaysys.com>