我似乎一直试图检索从ruby的Open3.popen3()方法启动的shell命令的退出状态。
这是我的代码:
require 'open3'
stdin, stdout, stderr = Open3.popen3('ls')
当我现在尝试访问$?
时,它仍然是nil
毕竟可以检索退出状态吗?
注意:
- ls
不是我在脚本中尝试使用的命令。我只是用它来举个例子。我的脚本有点复杂并且包含用户输入,这就是我需要Open3的清理功能的原因
- 我也尝试了popen3的块变体,但也没有成功。
答案 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
得出/返回四个参数,stdin
,stdout
,stderr
和wait_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
答案 2 :(得分:0)
您需要的所有内容(标准输出,错误和退出代码)分为三行:
require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5; ls")
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}"