ruby - 如何从 Ruby 调用 shell 命令

标签 ruby shell interop

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

最佳答案

此解释基于评论Ruby script来 self 的一个 friend 。如果您想改进脚本,请随时在链接上更新它。

首先,请注意,当 Ruby 调用 shell 时,它通常会调用 /bin/sh不是 Bash。 /bin/sh 不支持某些 Bash 语法在所有系统上。

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

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

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

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

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

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

    x 之后character 是分隔符,可以是任意字符。 如果分隔符是字符之一 ( , [ , { , 或 < , 文字由匹配的结束定界符之前的字符组成, 考虑到嵌套的定界符对。对于所有其他定界符, 文字包含直到下一次出现的字符 分隔符。字符串插值 #{ ... }是允许的。

    返回 shell 命令的结果(即标准输出),就像反引号一样。

    文档: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否则。

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

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

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

    不返回,当前进程被替换并且不再继续。

    文档: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
    

这里有一些额外的建议: $? ,与 $CHILD_STATUS 相同, 如果使用反引号 system(),则访问上次系统执行命令的状态或 %x{} . 然后您可以访问 exitstatuspid属性:

$?.exitstatus

更多阅读请看:

关于ruby - 如何从 Ruby 调用 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2232/

相关文章:

php - 如何将多个 PHP 参数传递给 bash

perl - Shell 变量在双引号 Perl 单行中可见

ruby-on-rails - 逆向工程 Gitlab 如何将 Devise 用于 PBKDF2 token

php - 将多个参数从 php 传递到 shell

ruby - 初学者试图找出为什么 2 组非常相似的代码有非常不同的结果

multithreading - 看门狗获胜服务,观看另一获胜服务

c# - 从 C# 传递位值

WPF - 是否必须处置 HwndSource?

ruby - Rakefile 和 Gemfile

ruby - 将 ORM 添加到现有的 padrino 应用程序