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

Ale*_*ski 60 ruby performance standards subprocess coding-style

1. ``Backtick

1. a)%x{}百分比X <Backtick的替代语法

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

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. 非常感谢Avdi Grimm的帖子描述了每种方法的示例用法:#1(&gist); #2(&gist); #3.

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

cam*_*cam 48

  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 filesystemvs 产生时的差异PTY.spawn


Ian*_*Ian 31

这是基于此答案的流程图.也参见,使用script以模拟终端.

在此输入图像描述