何时使用每个在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
。 当用system
vsPTY.spawn
产生时,看到grep --color=auto pat file
PTY.spawn
这是基于这个答案的stream程图。 另请参阅使用script
来模拟terminal 。
看看这篇文章系列:
- 在Ruby中启动subprocess的一打(或多个)方法:第1部分
- 在Ruby中启动subprocess的一打(或多个)方式:第2部分
- 在Ruby中启动subprocess的一些(或多个)方法:第3部分