在
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看到它的所有选项.