【问题标题】:How to retrieve exit status from ruby Open3.popen3()?如何从 ruby​​ Open3.popen3() 中检索退出状态?
【发布时间】:2013-02-08 01:22:02
【问题描述】:

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

这是我的代码:

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

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

到底有没有可能找回退出状态?

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

【问题讨论】:

    标签: ruby popen3


    【解决方案1】:

    简洁的答案是使用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?
    

    【讨论】:

    • 对该答案投了赞成票,因为它提供了一个代码示例。谢谢!
    【解决方案2】:

    你需要的一切(标准输出、错误和退出代码)都在三行中:

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

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

      • 我知道 open3 也返回一个线程,但不知道如何获取它的退出代码。 wait_thr.value.success? 很有魅力,非常感谢!
      猜你喜欢
      • 2014-10-09
      • 2017-02-12
      • 2023-04-07
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      相关资源
      最近更新 更多