Когда использовать каждый метод запуска подпроцесса в Ruby

1. `` Обратная кавычка

1. a) %x{} Percent X ‹альтернативный синтаксис для обратной кавычки

2. system()

3. fork()

4. open()

4.a. IO.popen() ‹ведет себя так же, как open()

4.b. open("|-")

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

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

5. Open3.popen3()

  • require 'open3'
  • stdlib Open3

6. PTY.spawn()

  • require 'pty'
  • stdlib PTY

7. Shell.transact()

  • require 'shell'
  • stdlib Shell

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

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

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


person Alec Wenzowski    schedule 27.08.2011    source источник
comment
+1 за содержательный вопрос :)   -  person isakkarlsson    schedule 27.08.2011
comment
Будет ли блок-схема лучшим способом ответить на этот вопрос?   -  person Alec Wenzowski    schedule 27.08.2011


Ответы (3)


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

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

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

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

    система блокируется до тех пор, пока подпроцесс не завершится.

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

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

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

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

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

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

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

person cam    schedule 31.08.2011

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

введите описание изображения здесь

person Ian    schedule 26.05.2015

Взгляните на эту серию статей:

person Michael Kohl    schedule 27.08.2011
comment
Спасибо за ссылки, Майкл. Я добавил это к вопросу. Однако, по моему мнению, они отвечают Как, а не Когда использовать каждый из них. - person Alec Wenzowski; 27.08.2011
comment
ИМХО они отвечают на оба вопроса, объясняя, как различные методы взаимодействуют с stdin, stdout и stderr, статьи помогают вам решить, какой из них использовать, исходя из ваших потребностей. Заботиться о возвращаемом значении чего-либо? Обратные кавычки это есть. Если вы хотите запускать что-то параллельно, выберите fork. В любом случае, я ставлю +1 на ваш вопрос и жду ответов, они могут быть интересными! :-) - person Michael Kohl; 27.08.2011