IPC::ReadpipeX - List form of readpipe/qx/backticks for capturing output
use IPC::ReadpipeX; my @entries = readpipex 'ls', '-l', $path; if ($?) { my $exit = $? >> 8; die "ls '$path' exited with status $exit"; } my $hostname = readpipex 'hostname', '-f'; chomp $hostname;
The built-in readpipe function, also known as the qx operator or backticks (``), runs a command and captures the output (STDOUT). However, unlike system and exec, the command will always be parsed by the shell, and it does not provide a list form to bypass shell parsing when multiple arguments are passed. "readpipex" provides this capability in a simple copy-pastable function.
qx
``
For other methods of redirecting output, capturing STDERR, and interacting with the process, consider the modules listed in "SEE ALSO".
readpipex is exported by default.
readpipex
my $output = readpipex $cmd, @args; my @output = readpipex $cmd, @args;
Runs the given command, capturing STDOUT and returning it as a single string in scalar context, or an array of lines in list context. If more than one argument is passed, the command will be executed directly rather than via the shell, as in system and exec.
Errors forking or running the command will raise an exception, and $! will be set to the error code. The exit status of the process is otherwise available in $? as normal.
The code of this function can easily be copy-pasted and is shown below.
sub readpipex { no warnings 'exec'; open my $stdout, '-|', @_ or die "readpipex '$_[0]' failed: $!"; my @output = wantarray ? readline($stdout) : do { local $/; scalar readline $stdout }; close $stdout; return wantarray ? @output : $output[0]; }
Behavior when passing no arguments is unspecified.
The -| open mode requires Perl 5.8 or newer on a system that supports forking, or Perl 5.22 or newer on Windows.
-|
Errors while reading or closing the pipe, though exceedingly rare, are ignored, as in the core readpipe.
Report any issues on the public bugtracker.
Dan Book <dbook@cpan.org>
This software is Copyright (c) 2019 by Dan Book.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)
IPC::System::Simple - provides system and capture functions with optional exit status checking and variants that always bypass the shell
system
capture
IPC::Run3 - run a process and direct STDIN, STDOUT, and STDERR
Capture::Tiny - capture STDOUT and STDERR in any wrapped code
IO::Async::Process - complete asynchronous control over a process and its handles
To install IPC::ReadpipeX, copy and paste the appropriate command in to your terminal.
cpanm
cpanm IPC::ReadpipeX
CPAN shell
perl -MCPAN -e shell install IPC::ReadpipeX
For more information on module installation, please visit the detailed CPAN module installation guide.