2013-02-22 9 views
15

Wydaje mi się, że utknąłem próbując odzyskać status wyjścia z polecenia powłoki, które zostało uruchomione z metody Ruby Open3.popen3().Jak odzyskać status wyjścia z ruby ​​Open3.popen3()?

Oto mój kod:

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

Kiedy teraz próbować dostępu $? nadal jest nil

Czy to możliwe, aby odzyskać status wyjścia po tym wszystkim?

Notatki:
- ls nie jest poleceniem, którego próbuję użyć w moim skrypcie. Po prostu użyłem tego, by dać przykład. Mój skrypt jest nieco bardziej złożony i zawiera dane wprowadzane przez użytkownika, dlatego potrzebuję funkcji dezynfekcji Open3.
- Próbowałem również wersji blokowej popen3, ale nie udało się z tym również.

Odpowiedz

16

popen3 wydajności/powraca cztery parametry stdin, stdout, stderr i wait_thr. wait_thr zawiera metodę wait_thr.value, która zwraca status wyjścia polecenia (w rzeczywistości jest to obiekt Process::Status zgodnie z dokumentacją). Również spojrzeć na http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3

+4

Wiedziałem, że Open3 powraca również wątek, ale nie wiem, jak uzyskać swój kod wyjścia. 'wait_thr.value.success?' działa jak urok, dziękuję bardzo! – Griddo

15

odpowiedź zwięzły jest użycie 4th parametr Open3: wait_thr

  • uzyskania ewentualnego błędu jest wskazany: wait_thr.value.success?
  • uzyskać rzeczywisty poziom błędu: wait_thr.value.exitstatus

Próbka:

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

Głosowała na tę odpowiedź, ponieważ zapewnia przykład kodu. Dzięki! –

0

Wszystko, czego potrzebujesz (standardowe wyjście, wyjście błędu i kod) w trzech liniach:

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