如何从Ruby调用shell命令

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

这个解释基于我的一个朋友的一个注释过的Ruby脚本。如果您想改进脚本,请随时在链接处进行更新

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

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

cmd=“echo'hi'”可以使用的示例字符串
  1. Kernel#`,通常称为backticks–`cmd`

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

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

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

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

    x字符后面是分隔符,可以是任何字符。
    如果分隔符是字符[{<lt;)之一,
    文字由字符组成,直到匹配的结束分隔符,
    考虑嵌套分隔符对。对于所有其他分隔符
    文字包含直到下一次出现的字符
    分隔符字符。允许字符串插值#{…}

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

    文件:https://docs.ruby-lang.org/en/master/syntax/literals_rdoc.html#label-百分比+字符串

    值=%x(回显'hi')
    值=%x[#{cmd}]
    
  3. 内核#系统

    在子shell中执行给定的命令

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

    文件:http://ruby-doc.org/core/Kernel.html#method-i-系统

    wasGood=system(“echo'hi'”)
    wasGood=系统(cmd)
    
  4. Kernel#exec

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

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

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

    exec(“echo'hi'”)
    exec(cmd)#注意:由于上面的行,将永远无法达到此目标
    

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

$?.exitstatus

欲了解更多信息,请参阅:

  • http://www.elctech.com/blog/i-m-in-ur-commandline-executin-ma-commands
  • http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html
  • http://tech.natemurray.com/2007/03/ruby-shell-commands.html

发表评论