操作系统或 Shell 命令

Exec:
Exec 的功能非常有限,执行后将退出 Ruby 程序并运行命令。

System 命令:
System 命令在子 shell 中运行,而不是替换当前进程并返回 true 或 nill。与反引号一样,系统命令是一个阻塞操作,主应用程序在此操作中等待,直到系统操作的结果完成。在这里,主要操作永远不必担心捕获从子进程引发的异常。

系统函数的输出将始终为 true 或 nil,具体取决于脚本是否已执行且没有错误。因此,执行脚本时的每个错误都不会传递给我们的应用程序。主要操作永远不必担心捕获从子进程引发的异常。在这种情况下,输出为 nil,因为子进程引发了异常。
这是一个阻塞操作,其中 Ruby 程序将等待命令的操作完成后再继续。
系统操作使用 fork 来分叉当前进程,然后使用 exec 执行给定的操作。

反引号(`):
反引号字符通常位于键盘上的转义键下方。反引号在子 shell 中运行,而不是替换当前进程并返回命令的结果。
在这里,我们可以获得命令的输出,但程序将在生成异常时崩溃。
如果子进程中存在异常,则将该异常提供给主进程,如果未处理异常,则主进程可能会终止。这是一个阻塞操作,其中 Ruby 程序将等待命令的操作完成后再继续。
系统操作使用 fork 来分叉当前进程,然后使用 exec 执行给定的操作。

IO.popen:
IO.popen 在子进程中运行。这里,子过程标准输入和标准输出连接到 IO 对象。

Popen3:
Popen3 允许你访问标准输入,标准输出和标准错误。
子进程的标准输入和输出将返回到 IO 对象。

$? (与$ CHILD_STATUS 相同)
可以与反引号,系统()或%x {}操作一起使用,并提供上次执行系统命令的状态。
这可能对访问 exitstatuspid 属性很有用。

$?.exitstatus