Open3.pipeline_r
# File tmp/rubies/ruby-4.0.0/lib/open3.rb, line 1104
def pipeline_r(*cmds, &block)
if Hash === cmds.last
opts = cmds.pop.dup
else
opts = {}
end
out_r, out_w = IO.pipe
opts[:out] = out_w
pipeline_run(cmds, opts, [out_w], [out_r], &block)
end
Basically a wrapper for Process.spawn that:
-
Creates a child process for each of the given
cmdsby callingProcess.spawn. -
Pipes the
stdoutfrom each child to thestdinof the next child, or, for the last child, to the caller’sstdout.
The method does not wait for child processes to exit, so the caller must do so.
With no block given, returns a 2-element array containing:
-
The
stdoutstream of the last child process. -
An array of the wait threads for all of the child processes.
Example:
last_stdout, wait_threads = Open3.pipeline_r('ls', 'grep R') # => [#<IO:fd 5>, [#<Process::Waiter:0x000055e8de2f9898 dead>, #<Process::Waiter:0x000055e8de2f94b0 sleep>]] puts last_stdout.read wait_threads.each do |wait_thread| wait_thread.join end
Output:
Rakefile README.md
With a block given, calls the block with the stdout stream of the last child process, and an array of the wait processes:
Open3.pipeline_r('ls', 'grep R') do |last_stdout, wait_threads| puts last_stdout.read wait_threads.each do |wait_thread| wait_thread.join end end
Output:
Rakefile README.md
Like Process.spawn, this method has potential security vulnerabilities if called with untrusted input; see Command Injection.
If the first argument is a hash, it becomes leading argument env in each call to Process.spawn; see Execution Environment.
If the last argument is a hash, it becomes trailing argument options in each call to Process.spawn; see Execution Options.
Each remaining argument in cmds is one of:
-
A
command_line: a string that begins with a shell reserved word or special built-in, or contains one or more metacharacters. -
An
exe_path: the string path to an executable to be called. -
An array containing a
command_lineor anexe_path, along with zero or more string arguments for the command.