2008-09-30 5 views
12

IO.popen() и систему() в Ruby, катастрофически не хватает несколько полезных функций, таких как:замену IO.popen Руби() и систему()

  • получение возвращаемое значение из функция
  • захвата как стандартный вывод и стандартный поток ошибок (отдельно и слитые)
  • работает без порождая дополнительный cmd.exe или/процесс бен/ш

Python имеет модуль «подпроцесс», который я думал об использовании как вдохновение n для аналогичного модуля в Ruby. Теперь на вопросы:

  • Как программисты Ruby работают над проблемами выше, например, получают возвращаемое значение при выполнении вызова popen()?
  • Это что-то, что уже реализовано?

ответ

9

Возьмите взгляд на стандартная рубиновая библиотека open3. Это даст вам доступ к stdin, stdout и stderr.

Существует также внешний проект под названием open4, который позволяет получить статус выхода без использования имени магической переменной.

+1

Обратите внимание, что для Ruby <1.9 open3 не дает статус выхода даже * с * именем глобальной переменной - http://redmine.ruby-lang.org/issues/show/1287 – 2010-01-22 18:48:28

9
  • система() Статус выхода может быть захвачен с $ ?. статус_завершениями
  • STDERR может быть захвачен с чем-то вроде команды '2> & 1' систем
+0

Прохладный. Я не знал о $ ?. exitstatus, спасибо! – JesperE 2008-09-30 20:21:13

1

Я чувствовал необходимость делать именно это при тестировании git_remote_branch. Инструмент вызывается в оболочку, и я хотел точно отобразить то, что было отображено во время тестовых прогонов, независимо от того, что отображал git, и неважно, было ли это выплевывание в stdout или stderr.

У меня есть модуль, который совершенно многоразовые, что можно наблюдать here (MIT лицензии: использовать по своему желанию, просто не подать в суд на меня ;-)

Вы можете увидеть его в действии в тестах на git_remote_branch here.

Кроме того, я создал репо специально для capture_fu, он включает в себя некоторые тесты и прочее. Однако проект не очень хорошо настроен. Я не потратил много времени на его освобождение ;-)

Смежные вопросы