NAME
IPC::System::Options - Perl's system(), readpipe()/qx, IPC::Run's run(), start() (with more options)
VERSION
This document describes version 0.341 of IPC::System::Options (from Perl distribution IPC-System-Options), released on 2023-05-24.
SYNOPSIS
use IPC::System::Options qw(system readpipe run start);
# use exactly like system()
system(...);
# use exactly like readpipe() (a.k.a. qx a.k.a. `` a.k.a. the backtick
# operator). if you import readpipe, you'll override the backtick operator with
# this module's version (along with your chosen settings).
my $res = readpipe(...);
$res = `...`;
# but these functions accept an optional hash first argument to specify options
system({...}, ...);
$res = readpipe({...}, ...);
# run without shell, even though there is only one argument
system({shell=>0}, "ls");
system({shell=>0}, "ls -lR"); # will fail, as there is no 'ls -lR' binary
$res = readpipe({shell=>0}, "ls -lR"); # ditto
# force shell, even though there are multiple arguments (arguments will be
# quoted and joined together for you, including proper quoting on Win32).
system({shell=>1}, "perl", "-e", "print 123"); # will print 123
$res = readpipe({shell=>1}, "perl", "-e", "print 123");
# note that to prevent the quoting mechanism from quoting some special
# characters (like ">") you can use scalar references, e.g.:
system({shell=>1}, "ls", "-laR", ">", "/root/ls-laR"); # fails, because the arguments are quoted so the command becomes: ls '-laR' '>' '/root/ls-laR'
system({shell=>1}, "ls", "-laR", \">", "/root/ls-laR"); # works
# set LC_ALL/LANGUAGE/LANG environment variable
$res = readpipe({lang=>"de_DE.UTF-8"}, "df");
# log using Log::ger, die on failure
system({log=>1, die=>1}, "blah", ...);
# chdir first before running program (and chdir back afterwards)
system({chdir => "/tmp", die => 1}, "some-program");
Set default options for all calls (prefix each option with dash):
use IPC::System::Options 'system', 'readpipe', -log=>1, -die=>1;
run()
is like system()
but uses IPC::Run's run()
instead of system()
:
run('ls');
# also accepts an optional hash first argument. some additional options that
# run() accepts: stdin.
run({capture_stdout => \$stdout, capture_stderr => \$stderr}, 'ls', '-l');
start()
is like run()
but uses IPC::Run's start()
instead of run()
to run program in the background. The result is a handle (see IPC::Run for more details) which you can then call finish()
, etc on.
my $h = start('ls', '-l');
...
$h->finish;
DESCRIPTION
This module provides replacement (wrapper) for Perl's system()
, readpipe()
(qx//, a.k.a. the backtick operator), as well as IPC::Run's start()
and run()
. The wrappers give you options like forcing/avoiding use of shell (like what IPC::System::Simple offers you), logging the arguments and/or output (using Log::ger), temporarily setting environment variables, temporarily setting working directory, dying on non-zero exit code, capturing (or tee-ing) output (stdout/stderr) (using Capture::Tiny), and a few others. They are meant as a convenience so you can just call system()
(or the other wrapper target) instead of doing some additional setup and cleanup yourself.
FUNCTIONS
system
Usage:
system([ \%opts ], @args) => $child_error ($?)
Just like perl's system()
except that it accepts an optional hash first argument to specify options. Currently known options:
shell => bool
Can be set to 0 to always avoid invoking the shell. The default is to use the shell under certain conditions, like perl's
system()
. But unlike perl'ssystem()
, you can force shell usage even though you pass multiple arguments (in which case, the arguments will be quoted for you, including proper quoting on Win32).lang => str
Temporarily set locale-related environment variables:
LC_ALL
(this is the highest precedence, even higher than the otherLC_*
variables includingLC_MESSAGES
),LANGUAGE
(this is used in Linux, with precedence higher thanLANG
but lower thanLC_*
), andLANG
.Of course you can set the environment variables manually (or use the
env
option), this option is just for convenience.env => hashref
Temporarily set environment variables.
log => bool
If set to true, then will log invocation as well as return/result value. Will log using Log::ger at the
trace
level.fail_log_level => str
When a command fail (and logging is enabled), log the failure message at this level. The default is
error
which is a sensible default but sometimes you want to log the failure at different level.die => bool
If set to true, will die on failure.
capture_stdout => scalarref
Capture stdout using Capture::Tiny.
Cannot be used together with
tee_*
orcapture_merged
.capture_stderr => scalarref
Capture stderr using Capture::Tiny.
Cannot be used together with
tee_*
orcapture_merged
.capture_merged => scalarref
Capture stdout and stderr in a single variable using Capture::Tiny's
capture_merged
.Cannot be used together with
tee_*
,capture_stdout
, orcapture_stderr
.tee_stdout => scalarref
Tee stdout using Capture::Tiny.
Cannot be used together with
capture_*
ortee_merged
.tee_stderr => scalarref
Capture stderr using Capture::Tiny.
Cannot be used together with
capture_*
ortee_merged
.tee_merged => scalarref
Capture stdout and stderr in a single variable using Capture::Tiny's
capture_merged
.Cannot be used together with
capture_*
,tee_stdout
, ortee_stderr
.chdir => str
Attempt to change to specified directory first and change back to the original directory after the command has been run. This is a convenient option so you can do this kind of task in a single call:
{ my $cwd = getcwd(); chdir $dir or die; system(...); chdir $cwd or die; }
If the attempt to chdir before command execution fails, will die if
die
option is set to true. Otherwise,$!
(OS error) will be set to thechdir()
error and to minimize surprise$?
(child exit code) will also be set to non-zero value (-1) even though at this point no child process has been run.If the attempt to chdir back (after command execution) fails, will die if
die
option is set to true. Otherwise,$!
will be set to thechdir()
error and$?
will be set to -1 only if$?
is zero. So if the command fails,$?
will contain the exit code of the command.dry_run => bool
If set to true, then will only display what would be executed to STDERR (or log at
warn
level, iflog
option is true) instead of actually executing the command.Will set
$?
(child exit code) to 0.An example of how this option can be used:
system({ dry_run => $ENV{DRY_RUN} }, ...);
This will allow you to run script in dry-run mode by setting environment variable.
exit_code_success_criteria => int|array[int]|Regexp|code
Specify which command exit codes are to be marked as success. For example, exit code 1 for the diff command does not signify an error; it just means that the two input files are different. So in this case you can either specify one of:
exit_code_success_criteria => [0,1] exit_code_success_criteria => qr/\A(0|1)\z/ exit_code_success_criteria => sub { $_[0] == 0 || $_[0] == 1 }
By default, if this option is not specified, non-zero exit codes count as failure.
Currently this only affects logging: when exit code is considered non-success, a warning log is produced and
readpipe()
does not log the result.
readpipe
Usage:
readpipe([ \%opts ], @args) => $output
Just like perl's readpipe()
(a.k.a. qx()
a.k.a. ``
a.k.a. the backtick operator) except that it accepts an optional hash first argument to specify options. And it can accept multiple arguments (in which case, the arguments will be quoted for you, including proper quoting on Win32).
Known options:
lang => str
See option documentation in
system()
.env => hash
See option documentation in
system()
.log => bool
See option documentation in
system()
.die => bool
See option documentation in
system()
.capture_stdout => scalarref
See option documentation in
system()
.capture_stderr => scalarref
See option documentation in
system()
.capture_merged => scalarref
See option documentation in
system()
.tee_stdout => scalarref
See option documentation in
system()
.tee_stderr => scalarref
See option documentation in
system()
.tee_merged => scalarref
See option documentation in
system()
.max_log_output => int
If set, will limit result length being logged. It's a good idea to set this (e.g. to 1024) if you expect some command to return large output.
chdir => str
See option documentation in
system()
.dry_run => bool
See option documentation in
system()
.exit_code_success_criteria => int|array[int]|Regexp|code
See option documentation in
system()
.
run
Usage:
run([ \%opts ], @args) => $is_success
Like system()
, but uses IPC::Run's run()
. Known options:
lang => str
See option documentation in
system()
.env => hash
See option documentation in
system()
.log => bool
See option documentation in
system()
.die => bool
See option documentation in
system()
.capture_stdout => scalarref|coderef
See option documentation in
system()
.capture_stderr => scalarref|coderef
See option documentation in
system()
.stdin => scalar
Supply standard input.
chdir => str
See option documentation in
system()
.dry_run => bool
See option documentation in
system()
.exit_code_success_criteria => int|array[int]|Regexp|code
See option documentation in
system()
.
start
Usage:
start([ \%opts ], @args) => $harness
Like run()
, but uses IPC::Run's start()
. For known options, see run()
.
HOMEPAGE
Please visit the project's homepage at https://metacpan.org/release/IPC-System-Options.
SOURCE
Source repository is at https://github.com/perlancar/perl-IPC-System-Options.
SEE ALSO
IPC::System::Simple also provides wrapper for system()
and readpipe()
with some additional behavior, although its scope is not as extensive as IPC::System::Options.
Proc::Govern similarly provide a run+options function, with a different set of options, including system load watching, logging output to file, disabling and screensaver or power management.
AUTHOR
perlancar <perlancar@cpan.org>
CONTRIBUTING
To contribute, you can send patches by email/via RT, or send pull requests on GitHub.
Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:
% prove -l
If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, Pod::Weaver::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla- and/or Pod::Weaver plugins. Any additional steps required beyond that are considered a bug and can be reported to me.
COPYRIGHT AND LICENSE
This software is copyright (c) 2023, 2021, 2020, 2019, 2017, 2016, 2015 by perlancar <perlancar@cpan.org>.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
BUGS
Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=IPC-System-Options
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.