@@ -983,15 +983,19 @@ def pipeline_rw(*cmds, &block)
983
983
# # => [#<IO:fd 5>, [#<Process::Waiter:0x00005638280167b8 sleep>, #<Process::Waiter:0x0000563828015480 dead>]]
984
984
#
985
985
# With a block given, calls the block with the +stdout+ stream
986
- # of the last child process:
986
+ # of the last child process,
987
+ # and an array of the wait processes:
987
988
#
988
- # Open3.pipeline_r('ls', 'grep R') {|x| puts x.read }
989
+ # Open3.pipeline_r('ls', 'grep R') do |x, ts|
990
+ # puts x.read
991
+ # p ts
992
+ # end
989
993
#
990
994
# Output:
991
995
#
992
- # CONTRIBUTING.md
993
996
# Rakefile
994
997
# README.md
998
+ # [#<Process::Waiter:0x000055f1d78d76f0 sleep>, #<Process::Waiter:0x000055f1d78d7358 dead>]
995
999
#
996
1000
# Like Process.spawn, this method has potential security vulnerabilities
997
1001
# if called with untrusted input;
@@ -1030,33 +1034,72 @@ def pipeline_r(*cmds, &block)
1030
1034
end
1031
1035
module_function :pipeline_r
1032
1036
1033
- # Open3.pipeline_w starts a list of commands as a pipeline with a pipe
1034
- # which connects to stdin of the first command.
1035
- #
1036
- # Open3.pipeline_w(cmd1, cmd2, ... [, opts]) {|first_stdin, wait_threads|
1037
- # ...
1038
- # }
1037
+
1038
+ # :call-seq:
1039
+ # Open3.pipeline_w([env, ] *cmds, options = {}) -> [first_stdin, wait_threads]
1039
1040
#
1040
- # first_stdin, wait_threads = Open3.pipeline_w(cmd1, cmd2, ... [, opts])
1041
- # ...
1042
- # first_stdin.close
1041
+ # Basically a wrapper for
1042
+ # {Process.spawn}[https://docs.ruby-lang.org/en/master/Process.html#method-c-spawn]
1043
+ # that:
1043
1044
#
1044
- # Each cmd is a string or an array.
1045
- # If it is an array, the elements are passed to Process.spawn.
1045
+ # - Creates a child process for each of the given +cmds+
1046
+ # by calling Process.spawn.
1047
+ # - Pipes the +stdout+ from each child to the +stdin+ of the next child,
1048
+ # or, for the first child, pipes the caller's +stdout+ to the child's +stdin+.
1049
+ # - Waits for all child processes to exit.
1046
1050
#
1047
- # cmd:
1048
- # commandline command line string which is passed to a shell
1049
- # [env, commandline, opts] command line string which is passed to a shell
1050
- # [env, cmdname, arg1, ..., opts] command name and one or more arguments (no shell)
1051
- # [env, [cmdname, argv0], arg1, ..., opts] command name and arguments including argv[0] (no shell)
1051
+ # With no block given, returns a 2-element array containing:
1052
1052
#
1053
- # Note that env and opts are optional, as for Process.spawn.
1053
+ # - The +stdin+ stream of the first child process.
1054
+ # - An array of the wait threads for all of the child processes.
1054
1055
#
1055
1056
# Example:
1056
1057
#
1057
- # Open3.pipeline_w("bzip2 -c", :out=>"/tmp/hello.bz2") {|i, ts|
1058
- # i.puts "hello"
1059
- # }
1058
+ # p Open3.pipeline_r(
1059
+ # ['ruby', '-e', 'print "Foo"'],
1060
+ # ['ruby', '-e', 'print STDIN.read + "Bar"']
1061
+ # )
1062
+ # [#<IO:fd 5>, [#<Process::Waiter:0x00005568cad44a08 sleep>, #<Process::Waiter:0x00005568cad44508 run>]]
1063
+ #
1064
+ # With a block given, calls the block with the +stdin+ stream
1065
+ # of the first child process,
1066
+ # and an array of the wait processes:
1067
+ #
1068
+ # Open3.pipeline_r(
1069
+ # ['ruby', '-e', 'print "Foo"'],
1070
+ # ['ruby', '-e', 'print STDIN.read + "Bar"']
1071
+ # ) do |x, ts|
1072
+ # puts x.read
1073
+ # p ts
1074
+ # end
1075
+ #
1076
+ # Output:
1077
+ #
1078
+ # FooBar
1079
+ # [#<Process::Waiter:0x000055628e2ebbc0 dead>, #<Process::Waiter:0x000055628e2eb7b0 sleep>]
1080
+ #
1081
+ # Like Process.spawn, this method has potential security vulnerabilities
1082
+ # if called with untrusted input;
1083
+ # see {Command Injection}[rdoc-ref:command_injection.rdoc].
1084
+ #
1085
+ # Unlike Process.spawn, this method waits for the child processes to exit
1086
+ # before returning, so the caller need not do so.
1087
+ #
1088
+ # If the first argument is a hash, it becomes leading argument +env+
1089
+ # in each call to Process.spawn;
1090
+ # see {Execution Environment}[https://docs.ruby-lang.org/en/master/Process.html#module-Process-label-Execution+Environment].
1091
+ #
1092
+ # If the last argument is a hash, it becomes trailing argument +options+
1093
+ # in each call to Process.spawn;
1094
+ # see {Execution Options}[https://docs.ruby-lang.org/en/master/Process.html#module-Process-label-Execution+Options].
1095
+ #
1096
+ # Each remaining argument in +cmds+ is one of:
1097
+ #
1098
+ # - A +command_line+: a string that begins with a shell reserved word
1099
+ # or special built-in, or contains one or more metacharacters.
1100
+ # - An +exe_path+: the string path to an executable to be called.
1101
+ # - An array containing a +command_line+ or an +exe_path+,
1102
+ # along with zero or more string arguments for the command.
1060
1103
#
1061
1104
def pipeline_w ( *cmds , &block )
1062
1105
if Hash === cmds . last
0 commit comments