Когда использовать каждый метод запуска подпроцесса в Ruby - PullRequest
55 голосов
/ 27 августа 2011

1. `` The Backtick

1. а) %x{} Процент X <альтернативный синтаксис для The Backtick </h3> определено в parse.y, см. обсуждение 2. system() Kernel # система 3. fork() Kernel # fork, Process # fork 4. open() открыть трубу Kernel # открыт 4.a. IO.popen() <ведет себя так же, как <code>open()

4.b. open("|-")

  • вилка к трубе

4.c. IO.popen("-") <ведет себя так же, как <code>open("|-")

5. Open3.popen3()

6. PTY.spawn()

  • require 'pty'
  • stdlib PTY

7. Shell.transact()

Когда следует отказаться от верной галочки для одного из более сложных методов?

Редактировать 1. Большое спасибо Авди Гримм за его посты, описывающие пример использования каждого метода: # 1 (& gist ); # 2 (& gist ); # 3 .

Это фантастические ресурсы для ответа Как , но они явно не составлены так, чтобы отвечать , когда каждый из них должен использоваться или Почему , и как таковые ИМХО не являются полные ответы на этот вопрос.

Ответы [ 3 ]

43 голосов
/ 01 сентября 2011
  1. используйте обратные пометки, когда вы хотите легко зафиксировать выходные данные программы в переменной. вы, вероятно, хотите использовать это только для коротко работающих программ, потому что это заблокирует.

  2. system удобно в двух разных случаях:

    а. У вас есть долго работающая программа, и вы хотите, чтобы вывод печатался во время работы (например, system("tar zxvf some_big_tarball.tar.gz"))

    б. system может обойти расширение оболочки как exec (сравните вывод system "echo *" и system "echo", "*")

    системные блоки до выхода из подпроцесса.

  3. fork также имеет несколько вариантов использования:

    а. Вы хотите запустить некоторый код ruby ​​в отдельном процессе (например, fork { .... }

    б. Вы хотите запустить дочерний процесс (или другую программу), не блокируя выполнение вашего скрипта fork { exec "bash" }.

    fork - ваш друг, если вы хотите демонизировать вашу программу.

  4. IO.popen полезно, когда вам нужно взаимодействовать со стандартным выходом и стандартным входом в программу. Обратите внимание, что он не фиксирует стандартную ошибку, поэтому вам нужно перенаправить ее с помощью 2>&1, если вам это нужно.

  5. popen3 предоставляет отдельный дескриптор файла для стандартной ошибки (для случая, когда вам нужно захватить это отдельно от стандартного вывода)

  6. PTY.spawn необходим, если вы хотите, чтобы порожденная программа работала так же, как вы работаете с терминала. См. Разницу grep --color=auto pat file при появлении system против PTY.spawn

28 голосов
/ 26 мая 2015

Вот блок-схема, основанная на этом ответе . См. Также, с использованием script для эмуляции терминала .

enter image description here

...