Skip to content
class method

Open3.pipeline_w

Open3.pipeline_w([env, ] *cmds, options = {}) → [first_stdin, wait_threads]

Basically a wrapper for Process.spawn that:

  • Creates a child process for each of the given cmds by calling Process.spawn.

  • Pipes the stdout from each child to the stdin of the next child, or, for the first child, pipes the caller’s stdout to the child’s stdin.

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 stdin stream of the first child process.

  • An array of the wait threads for all of the child processes.

Example:

Example
first_stdin, wait_threads = Open3.pipeline_w('sort', 'cat -n')
# => [#<IO:fd 7>, [#<Process::Waiter:0x000055e8de928278 run>, #<Process::Waiter:0x000055e8de923e80 run>]]
first_stdin.puts("foo\nbar\nbaz")
first_stdin.close # Send EOF to sort.
wait_threads.each do |wait_thread|
  wait_thread.join
end

Output:

1 bar
2 baz
3 foo

With a block given, calls the block with the stdin stream of the first child process, and an array of the wait processes:

Example
Open3.pipeline_w('sort', 'cat -n') do |first_stdin, wait_threads|
  first_stdin.puts("foo\nbar\nbaz")
  first_stdin.close # Send EOF to sort.
  wait_threads.each do |wait_thread|
    wait_thread.join
  end
end

Output:

1 bar
2 baz
3 foo

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_line or an exe_path, along with zero or more string arguments for the command.

See Argument command_line or exe_path.

See also #pipeline_w .pipeline_start .popen2 .pipeline_rw also in 4.1 · 3.4 · 3.3 · 3.2 · 3.1 · 3.0