如何从ruby Open3.popen3()中检索退出状态?

时间:2013-02-22 12:10:09

标签: ruby popen3

我似乎一直试图检索从ruby的Open3.popen3()方法启动的shell命令的退出状态。

这是我的代码:

require 'open3'
stdin, stdout, stderr = Open3.popen3('ls')

当我现在尝试访问$?时,它仍然是nil

毕竟可以检索退出状态吗?

注意:
- ls不是我在脚本中尝试使用的命令。我只是用它来举个例子。我的脚本有点复杂并且包含用户输入,这就是我需要Open3的清理功能的原因 - 我也尝试了popen3的块变体,但也没有成功。

3 个答案:

答案 0 :(得分:24)

简明回答是使用open3的第4个参数:wait_thr

  • 获取是否显示任何错误:wait_thr.value.success?
  • 获取实际错误级别:wait_thr.value.exitstatus

样品:

Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
  return_value = wait_thr.value
end
puts "Error level was: #{return_value.exitstatus}" unless return_value.success?

答案 1 :(得分:23)

popen3得出/返回四个参数,stdinstdoutstderrwait_thrwait_thr包含一个方法wait_thr.value,它返回命令的退出状态(事实上,根据文档,它是一个Process::Status对象)。另请查看http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3

答案 2 :(得分:0)

您需要的所有内容(标准输出,错误和退出代码)分为三行:

require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5; ls")
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}"