为什么要使用本机函数而不是系统调用?

Why should native functions be used instead of system calls?

代码审阅者要求对类似于以下的一段代码进行更改:

system("grep foo /tmp/bar")

或者这个:

res, err, st = Open3.capture3("grep foo /tmp/bar")

审稿人说:

Just read the file natively in Ruby, no need to fork a sub-command.

为什么审阅者认为使用 Ruby 的本机函数更好,例如 File.read,即使在子命令调用中没有不受信任的数据?

最好的办法显然是询问审稿人,而不是我们。但我可以推测。

  • 调用子 shell 效率较低,简单明了。它需要一个额外的进程,而 File.read 在当前进程中运行。
  • 您的密码现在是 OS-dependent。例如,Windows 没有 grep 命令,但是 File.read 可以在任何运行 Ruby.
  • 的 OS 上运行
  • 乍看之下,一个子shell让我觉得发生了一些有趣的事情。如果我看到 File.read,我希望它出现在 Ruby 代码中。如果我看到一个 system 调用,我开始怀疑发生了一些奇怪的事情,使我怀疑代码的性质。

无论如何,在 Ruby 中进行 grepping 仍然非常简单。其实字面意思就是grep.

File.readlines("/tmp/bar").grep(/foo/)

如果我在代码审查中遇到问题中的 grep 代码,我可能会出于上述原因标记它。