加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:39:28 所属栏目:百科 来源:网络整理
导读:在 Ruby中,我希望能够: 运行命令行(通过shell) 捕获stdout和stderr(最好是单流),而不使用 2 1(在这里某些命令失败) 运行附加环境变量(不修改ruby程序本身的环境) 我知道Open3允许我做1和2. cmd = 'a_prog --arg ... --arg2 ...' Open3.popen3("#{cmd}") { |
在 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看到它的所有选项.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读