何时使用每个在Ruby中启动subprocess的方法

1. `` TheTick”

  • 在内核中定义

1. a) %x{} Percent X <The Backtick的替代语法

  • 在parse.y中定义,参见讨论

2. system()

  • 内核#系统

3. fork()

  • 内核#fork,进程#fork

4. open()

  • 打开一个pipe道
  • 内核#开

4.A. IO.popen()行为与open()相同

  • 打开一个pipe道
  • IO#POPEN

4.B. open("|-")

  • 叉到一个pipe道

4.C. IO.popen("-") <与open("|-")行为相同

  • 叉到一个pipe道
  • 看讨论

5. Open3.popen3()

  • require 'open3'
  • stdlib Open3

6. PTY.spawn()

  • require 'pty'
  • stdlib PTY

7. Shell.transact()

  • require 'shell'
  • stdlib Shell

什么时候应该放弃一个更复杂的方法的可靠反弹?

编辑1.非常感谢Avdi Grimm ,他的post描述了每种方法的示例用法: #1 (& gist ); #2 (& gist ); #3 。

他们是很好的资源来回答如何 ,但没有明确构成回答什么时候应该使用为什么 ,因此恕我直言,这是不完整的答案这个问题。

  1. 当你想在一个variables中轻松捕获程序的输出时使用反引号。 你可能只想使用这个短跑程序,因为这会阻止。

  2. system在两种不同情况下都很方便:

    一个。 你有一个长期运行的程序,你想输出打印,因为它运行(例如system("tar zxvf some_big_tarball.tar.gz")

    system可以像exec一样绕过shell扩展(比较system "echo *"system "echo", "*"

    系统块,直到subprocess退出。

  3. fork也有一些不同的用例:

    一个。 你想在一个单独的进程中运行一些ruby代码(例如fork { .... }

    湾 你想运行一个subprocess(或不同的程序),而不会阻塞你的脚本进程fork { exec "bash" }

    fork是你的朋友,如果你想守护你的程序。

  4. 当您需要与程序的标准input和标准input交互时, IO.popen非常有用。 请注意,它不捕获标准的err,所以如果你关心的话,你需要用2>&1来redirect。

  5. popen3为您提供了一个单独的文件描述符的标准错误(因为当你需要从标准输出单独捕获)

  6. 如果您希望生成的程序像从terminal运行一样运行,则需要PTY.spawn 。 当用system vs PTY.spawn产生时,看到grep --color=auto pat file PTY.spawn

这是基于这个答案的stream程图。 另请参阅使用script来模拟terminal 。

在这里输入图像说明

看看这篇文章系列:

  • 在Ruby中启动subprocess的一打(或多个)方法:第1部分
  • 在Ruby中启动subprocess的一打(或多个)方式:第2部分
  • 在Ruby中启动subprocess的一些(或多个)方法:第3部分