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

Ruby中,我希望能够:

>运行命令行(通过shell)
>捕获stdout和stderr(最好是单流),而不使用> 2& 1(在这里某些命令失败)
>运行附加环境变量(不修改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允许您在指定命令行时传递环境,但不允许传递.

如何编写所有三个代码

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

>>> 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,e|
  output = o.read()
  error = e.read()
  # FIXME: don't want to *separate out* stderr like this
  repr = "$#{cmd}\n#{output}"
}

Open使用Process.spawn来启动命令,所以你可以看看documentation for Process.spawn看到它的所有选项.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...