Подтвердить что ты не робот

Внедрение замены для Ruby IO.popen() и системы()

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

  • получение возвращаемого значения функции
  • захват как stdout, так и stderr (отдельно и слияние)
  • работает без создания дополнительного процесса cmd.exe или /bin/sh.

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

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

Ответ 1

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

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

Ответ 2

  • Статус системы() может быть записан с помощью $?. exitstatus
  • stderr может быть захвачен чем-то вроде системной команды 2 > & 1 '

Ответ 3

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

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

Вы можете увидеть это в действии в тестах для git_remote_branch здесь.

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