HOWTO: Use Ruby IO with shell execution (STDIN, STDOUT, STDERR, PID)
|
|
| # 1. IO.popen |
| # Runs the specified command as a subprocess; the subprocess's standard |
| # input and output will be connected to the returned IO object. This |
| # allows you to provide STDIN input and get STDOUT output easily. |
| # Asynchronous (IO objects) |
| # Return: IO object, (IO#pid, IO#read) |
| # Docs: https://www.rubydoc.info/stdlib/core/IO.popen |
|
|
| io = IO.popen("echo 'hi'") # Or IO.popen(["echo", "hi"]) |
| io = IO.popen(cmd) |
|
|
| IO.popen(["echo", "'hi'"]) do |io| |
| # ... |
| end |
|
|
|
|
| # 2. open3 |
| # Runs the specified command as a subprocess; the subprocess's standard |
| # input, stdout, and stderr IO objects are available. There is also |
| # an "open4" gem to more easily get the PID of the child process. |
| # Synchronous (get strings) or Asynchronous (IO objects) |
| # Return: Strings (capture*) or IO objects (popen*) |
| # Docs: https://docs.ruby-lang.org/en/2.5.0/Open3.html#method-c-popen3 |
|
|
| require 'open3' |
| stdin_io, stdout_io, stderr_io, process_waiter = Open3::popen3(cmd) |
| stdout_str, stderr_str, process_info = Open3::capture3(cmd) |
|
|
| require 'open4' |
| pid, stdin, stdout, stderr = Open4::popen4(cmd); |
|
|
|
|
| # Extra Advice - Exit Code |
| # $? which is the same as $CHILD_STATUS (if you require 'english') |
| # Accesses the status of the last system executed command if |
| # you use the backticks, system() or %x{}. |
| # You can then access the ``exitstatus'' and ``pid'' properties |
| # Docs: https://ruby-doc.org/core-2.7.1/Process/Status.html#method-i-exitstatus |
|
|
|
|
No comments:
Post a Comment