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

Gri*_*ddo 19 ruby popen3

我似乎被困在尝试检索从ruby的Open3.popen3()方法启动的shell命令的退出状态.

这是我的代码:

require 'open3'
stdin, stdout, stderr = Open3.popen3('ls')
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 25

简明的回答是使用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?
Run Code Online (Sandbox Code Playgroud)

  • 投票了这个答案,因为它提供了一个代码示例。谢谢! (2认同)

ckr*_*use 23

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

  • 我知道open3也返回一个线程,但不知道如何获取它的退出代码.`wait_thr.value.success?`就像一个魅力,非常感谢你! (4认同)