使用自定义环境运行命令行

Rei*_*ica 14 ruby environment popen

在Ruby中,我希望能够:

  1. 运行命令行(通过shell)
  2. 捕获stdout和stderr(最好是单个流)而不使用>2&1(这里的某些命令失败)
  3. 运行其他环境变量(不修改ruby程序本身的环境)

我了解到Open3允许我做1和2.

              cmd = 'a_prog --arg ... --arg2 ...'
              Open3.popen3("#{cmd}") { |i,o,e|
                output = o.read()
                error = e.read()
                # FIXME: don't want to *separate out* stderr like this
                repr = "$ #{cmd}\n#{output}"
              }
Run Code Online (Sandbox Code Playgroud)

我还了解到,popen允许您传递环境,但不能在指定命令行时传递.

如何编写能够完成所有这三项的代码?

...

换句话说,以下Python代码的Ruby等价物是什么?

>>> import os, subprocess
>>> env = os.environ.copy()
>>> env['MYVAR'] = 'a_value'
>>> subprocess.check_output('ls -l /notexist', env=env, stderr=subprocess.STDOUT, shell=True)
Run Code Online (Sandbox Code Playgroud)

Dyl*_*kow 17

Open.popen3 可选地接受散列作为第一个参数(在这种情况下,您的命令将是第二个参数:

cmd = 'a_prog --arg ... --arg2 ...'
Open3.popen3({"MYVAR" => "a_value"}, "#{cmd}") { |i,o,e|
  output = o.read()
  error = e.read()
  # FIXME: don't want to *separate out* stderr like this
  repr = "$ #{cmd}\n#{output}"
}
Run Code Online (Sandbox Code Playgroud)

Open用于Process.spawn启动命令,因此您可以查看Process.spawn文档以查看其所有选项.