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

在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}" } 

我还了解到, 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) 

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}" } 

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