2013-02-22 35 views
15

Tôi dường như bị kẹt cố gắng truy xuất trạng thái thoát của lệnh shell được khởi động từ phương thức Open3.popen3() của Ruby.Làm thế nào để lấy trạng thái thoát khỏi ruby ​​Open3.popen3()?

Dưới đây là mã của tôi:

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

Khi tôi bây giờ cố gắng truy cập $? nó vẫn là nil

Có thể lấy lại trạng thái thoát sau khi tất cả?

Ghi chú:
- ls không phải là lệnh tôi đang cố gắng sử dụng trong tập lệnh của mình. Tôi chỉ sử dụng điều này để đưa ra một ví dụ. Kịch bản của tôi phức tạp hơn một chút và chứa đầu vào của người dùng, đó là lý do tại sao tôi cần chức năng vệ sinh của Open3.
- Tôi cũng đã thử biến thể khối của popen3, nhưng cũng không thành công với biến thể đó.

Trả lời

16

popen3 sản lượng/trả về bốn thông số, stdin, stdout, stderrwait_thr. wait_thr chứa phương thức wait_thr.value trả về trạng thái thoát của lệnh (trên thực tế, nó là đối tượng Process::Status theo tài liệu). Cũng có một cái nhìn tại http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3

+4

Tôi biết rằng open3 cũng trả về một chuỗi nhưng không biết cách lấy mã thoát. 'wait_thr.value.success?' hoạt động như một sự quyến rũ, cảm ơn bạn rất nhiều! – Griddo

15

Câu trả lời ngắn gọn là sử dụng các tham số thứ 4 của open3: wait_thr

  • có được cho dù bất kỳ lỗi được chỉ định: wait_thr.value.success?
  • nhận được mức độ lỗi thực tế: wait_thr.value.exitstatus

Mẫu:

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? 
+0

Up bình chọn câu trả lời này bởi vì nó cung cấp một ví dụ mã. Cảm ơn! –

0

Mọi thứ bạn cần (đầu ra tiêu chuẩn, mã lỗi và mã thoát) trong ba dòng:

require 'open3' 
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5; ls") 
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}" 
Các vấn đề liên quan