从Ruby调用shell命令

如何从Ruby程序内部调用shell命令? 那我如何从这些命令的输出回到Ruby?


这个解释基于来自我的一位朋友的评论Ruby脚本。 如果您想改进脚本,请随时在链接中更新它。

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

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

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

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

    返回shell命令的结果。

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

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

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

    返回shell命令的结果,就像反引号一样。

    文档:http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html

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

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

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

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

    wasGood = system( "echo 'hi'" )
    wasGood = system( cmd )
    
  • 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
    

    更多阅读请参阅:

  • http://www.elctech.com/blog/im-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

  • 我喜欢这样做的方式是使用%x文字,这使得在命令中使用引号变得容易(并且易读!),如下所示:

    directorylist = %x[find . -name '*test.rb' | sort]
    

    在这种情况下,它将在当前目录下使用所有测试文件填充文件列表,您可以按预期进行处理:

    directorylist.each do |filename|
      filename.chomp!
      # work with file
    end
    

    这是一个基于这个答案的流程图。 另请参阅使用script模拟终端。

    在这里输入图像描述

    链接地址: http://www.djcxy.com/p/633.html

    上一篇: Calling shell commands from Ruby

    下一篇: Move commits from master onto a branch using git