何时使用在Ruby中启动子进程的每种方法

1. `` The Backtick”

  • 在Kernel中定义
  • 1. a) %x{} Percent X <The Backtick的替代语法

  • 在parse.y中定义,参见讨论
  • 2. system()

  • 内核#系统
  • 3. fork()

  • 内核#fork,进程#fork
  • 4. open()

  • 打开一个管道
  • 内核#开
  • 4.A. IO.popen() <表现方式与open()相同

  • 打开一个管道
  • IO#POPEN
  • 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.非常感谢Avdi Grimm,他的帖子描述了每种方法的示例用法:#1(&gist); #2(&gist); #3。

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


  • 当您想要轻松捕获变量中程序的输出时使用反引号。 你可能只想使用这个短程序,因为这会阻止。

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

    一个。 您有一个长时间运行的程序,并且您希望输出在运行时进行打印(例如system("tar zxvf some_big_tarball.tar.gz")

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

    系统块,直到子进程退出。

  • fork也有一些不同的用例:

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

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

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

  • 当您需要与程序的标准输出和标准输入进行交互时, IO.popen非常有用。 请注意,它不会捕获标准err,因此如果您在意这一点,则需要使用2>&1重定向。

  • popen3为您提供了一个单独的文件描述符用于标准错误(因为当您需要从标准输出中单独捕获时)

  • 如果您希望衍生的程序像从终端运行一样运行,则需要PTY.spawn 。 使用system vs PTY.spawn生成时,请查看grep --color=auto pat file PTY.spawn


  • 这是一个基于这个答案的流程图。 另请参阅使用script模拟终端。

    在这里输入图像描述


    看看这篇文章系列:

  • 在Ruby中启动子进程的一打(或多个)方法:第1部分
  • 在Ruby中启动子进程的一打(或多个)方式:第2部分
  • 十几种(或多种)的方式来启动Ruby中的子进程:第3部分
  • 链接地址: http://www.djcxy.com/p/25291.html

    上一篇: When to use each method of launching a subprocess in Ruby

    下一篇: Trick an application into thinking its stdout is a terminal, not a pipe