如何从Ruby程序内部调用shell命令?然后如何将这些命令的输出返回到Ruby中?

推荐答案

这个解释是基于我一个朋友的 comments .如果你想改进脚本,请随时在链接中更新它.

首先,请注意,当Ruby调用shell时,它通常会调用/bin/shnot Bash.并非所有系统上的/bin/sh都支持某些Bash语法.

以下是执行shell脚本的方法:

cmd = "echo 'hi'" # Sample string that can be used
  1. Kernel#`,通常称为backticks–`cmd`

    这与许多其他语言一样,包括Bash、PHP和Perl.

    返回shell命令的结果(即标准输出).

    doctor :http://ruby-doc.org/core/Kernel.html#method-i-60

    value = `echo 'hi'`
    value = `#{cmd}`
    
  2. 内置语法,%x( cmd )

    x个字符后是分隔符,可以是任何字符.

    返回shell命令的结果(即标准输出),就像backticks一样.

    doctor :https://docs.ruby-lang.org/en/master/syntax/literals_rdoc.html#label-Percent+Strings

    value = %x( echo 'hi' )
    value = %x[ #{cmd} ]
    
  3. Kernel#system

    在子shell中执行给定的命令.

    如果找到并成功运行该命令,则返回true,否则返回false.

    doctor :http://ruby-doc.org/core/Kernel.html#method-i-system

    wasGood = system( "echo 'hi'" )
    wasGood = system( cmd )
    
  4. Kernel#exec

    通过运行给定的外部命令替换当前进程.

    返回none,当前进程将被替换,并且永远不会继续.

    doctor :http://ruby-doc.org/core/Kernel.html#method-i-exec

    exec( "echo 'hi'" )
    exec( cmd ) # Note: this will never be reached because of the line above
    

这里有一些额外的建议:

$?.exitstatus

更多阅读请参见:

Ruby相关问答推荐

如何在 Ruby 中创建可调用属性

在Ruby中按字母顺序对数组中的数组进行排序?

Ruby 和用正则表达式分割字符串

使用 Drive API 创建空文件

如何使用 Ruby 的 optparse 解析没有名称的参数

define_method:如何动态创建带参数的方法

什么是 '?-mix' 在 Ruby 正则表达式中

Ruby检测方法

有没有比 Rspec 的 `should_receive` 更少干扰的替代方法?

如何从正在运行的脚本进入 IRB 提示符?

将方法应用于数组/可枚举中的每个元素

如何在 Ruby 中临时重定向标准错误?

我可以在 Ruby 2.x 中要求命名参数吗?

如何从 SystemStackError 中获取回溯:堆栈级别太深?

RSpec:我如何在期望语法中使用数组包含匹配器

ActiveSupport::Memoizable 指的是哪种 Ruby memoize 模式?

Ruby - 无法修改冻结的字符串 (TypeError)

您的 Ruby 版本是 2.0.0,但您的 Gemfile 指定了 2.1.0

从 'mm/dd/yyyy' 格式解析 ruby​​ DateTime

严格将字符串转换为整数(或 nil)