22

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

这是我的代码:

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

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

毕竟有可能检索退出状态吗?

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

4

3 回答 3

31

简洁的答案是使用 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?
于 2015-07-30T01:50:29.257 回答
27

popen3产生/返回四个参数,stdin,和. 包含一个返回命令退出状态的方法(实际上,根据文档,它是一个对象)。也看看http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3stdoutstderrwait_thrwait_thrwait_thr.valueProcess::Status

于 2013-02-22T12:15:11.100 回答
2

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

require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5; ls")
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}"
于 2016-10-07T13:47:56.537 回答