1. `` The Backtick

  • defined in 100

1. a) %x{} Percent X < alternate syntax for The Backtick

  • defined in parse.y, see 100

2. system()

  • 100

3. fork()

  • 100

4. open()

  • 打开一根管子
  • 100

4.a. IO.popen() < behaves the same as open()

  • 打开一根管子
  • 100

4.b. open("|-")

  • 叉到烟斗上

4.c. IO.popen("-") < behaves the same as open("|-")

5. Open3.popen3()

  • require 'open3'
  • stdlib Open3

6. PTY.spawn()

  • require 'pty'
  • stdlib PTY

7. Shell.transact()

  • require 'shell'
  • stdlib Shell

什么时候应该放弃可靠的支持, Select 更复杂的方法?

Edit 1.

它们是回答How的绝佳资源,但没有明确地组成回答when each should be usedWhy,因此IMHO也不是这个问题的完整答案.

推荐答案

  1. 当您想要轻松地在变量中捕获程序的输出时,请使用backticks.您可能只想将其用于短时间运行的程序,因为这会阻塞.

  2. system在两种不同的情况下都很方便:

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

    b、 system可以绕过exec这样的shell 扩展(比较system "echo *"system "echo", "*"的输出)

    系统阻塞,直到子进程退出.

  3. fork还有几个不同的用例:

    a、 你想在一个单独的进程中运行一些ruby代码(例如fork { .... })

    b、 您希望运行一个子进程(或不同的程序),而不阻止脚本fork { exec "bash" }的进度.

    如果你想后台监控你的程序,fork是你的朋友.

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

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

  6. 当您希望生成的程序表现得像从终端运行一样时,PTY.spawn是必需的.看到grep --color=auto pat filesystem的区别了吗

Ruby相关问答推荐

Ruby将字符串中的反斜杠替换为双反斜杠

如何在Ruby中匹配大型IP网络对象列表中的IP地址

使用 Ruby,我如何访问和比较这些嵌套的数组值?

RSpec 是否有 python 类似功能来做 TDD?

Python 正则表达式是否等同于 Ruby 的原子分组?

在ruby中反转数组的顺序

如何修改 Ruby gem

如何通过 Rack 提供静态文件?

如果浮点组件不是 .00 sprintf/printf,则仅显示小数点

Ruby数组中的`return`#map

判断 Ruby Gem 的可用性

Ruby - 将块传递给方法

使用 Homebrew 安装 Ruby

如何在Ruby中返回两个字符串之间的字符串的子字符串?

与 String 相比,在 Ruby 中使用 StringIO 有哪些优势?

比较两个数组忽略Ruby中的元素顺序

判断字符串是否为空的Ruby方法?

了解 ruby​​-prof 输出

Ruby:define_method 与 def

Ruby:如何在不指向同一个对象的情况下复制变量?