何时使用在Ruby中启动子进程的每种方法
1. ``
The Backtick”
1. a) %x{}
Percent X <The Backtick的替代语法
2. system()
3. fork()
4. open()
4.A. IO.popen()
<表现方式与open()
相同
4.B. open("|-")
4.C. IO.popen("-")
<与open("|-")
行为相同
5. Open3.popen3()
require 'open3'
6. PTY.spawn()
require 'pty'
7. Shell.transact()
require '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
模拟终端。
看看这篇文章系列:
上一篇: When to use each method of launching a subprocess in Ruby
下一篇: Trick an application into thinking its stdout is a terminal, not a pipe