Ale*_*ski 60 ruby performance standards subprocess coding-style
``Backtick%x{}百分比X <Backtick的替代语法system()fork()open()IO.popen()<表现相同open()open("|-")IO.popen("-")<表现相同open("|-")Open3.popen3()require 'open3'PTY.spawn()require 'pty'Shell.transact()require 'shell'编辑1. 非常感谢Avdi Grimm的帖子描述了每种方法的示例用法:#1(&gist); #2(&gist); #3.
他们是很好的资源来回答如何,但没有明确的组成来回答每个应该使用或为什么,并因此恕我直言这个问题不完整的答案.
cam*_*cam 48
如果想要在变量中轻松捕获程序的输出,请使用反引号.你可能只想将它用于短期运行程序,因为这会阻塞.
system 在两种不同的情况下很方便:
一个.你有一个长时间运行的程序,你希望输出在运行时打印(例如system("tar zxvf some_big_tarball.tar.gz"))
湾 system可以绕过外壳膨胀等exec(比较器的输出system "echo *"和system "echo", "*")
系统阻塞,直到子进程退出.
fork 还有几个不同的用例:
一个.您希望在单独的进程中运行一些ruby代码(例如fork { .... }
湾 您希望在不阻止脚本进度的情况下运行子进程(或其他程序)fork { exec "bash" }.
fork 如果你想要守护你的程序,你的朋友是你的朋友.
IO.popen当您需要与程序的标准输出和标准交互时,它非常有用.请注意,它不会捕获标准错误,因此2>&1如果您关心它,则需要将其重定向.
popen3 为标准错误提供单独的文件描述符(当您需要从标准输出中单独捕获时)
PTY.spawn当您希望生成的程序表现得像从终端运行时,则是必需的.看看grep --color=auto pat file与systemvs 产生时的差异PTY.spawn