何时使用每个在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 。
他们是很好的资源来回答如何 ,但没有明确构成回答什么时候应该使用或为什么 ,因此恕我直言,这是不完整的答案这个问题。
- 
当你想在一个variables中轻松捕获程序的输出时使用反引号。 你可能只想使用这个短跑程序,因为这会阻止。 
- 
system在两种不同情况下都很方便:一个。 你有一个长期运行的程序,你想输出打印,因为它运行(例如 system("tar zxvf some_big_tarball.tar.gz"))湾 system可以像exec一样绕过shell扩展(比较system "echo *"和system "echo", "*")系统块,直到subprocess退出。 
- 
fork也有一些不同的用例:一个。 你想在一个单独的进程中运行一些ruby代码(例如 fork { .... }湾 你想运行一个subprocess(或不同的程序),而不会阻塞你的脚本进程 fork { exec "bash" }。fork是你的朋友,如果你想守护你的程序。
- 
当您需要与程序的标准input和标准input交互时, IO.popen非常有用。 请注意,它不捕获标准的err,所以如果你关心的话,你需要用2>&1来redirect。
- 
popen3为您提供了一个单独的文件描述符的标准错误(因为当你需要从标准输出单独捕获)
- 
如果您希望生成的程序像从terminal运行一样运行,则需要 PTY.spawn。 当用systemvsPTY.spawn产生时,看到grep --color=auto pat filePTY.spawn
 这是基于这个答案的stream程图。 另请参阅使用script来模拟terminal 。 
  
 
看看这篇文章系列:
- 在Ruby中启动subprocess的一打(或多个)方法:第1部分
- 在Ruby中启动subprocess的一打(或多个)方式:第2部分
- 在Ruby中启动subprocess的一些(或多个)方法:第3部分