Execute bash commands from a Rakefile

This question already has an answer here:

  • Calling shell commands from Ruby 19 answers

  • I think the way rake wants this to happen is with: http://rubydoc.info/gems/rake/FileUtils#sh-instance_method Example:

    task :test do
      sh "ls"
    end
    

    The built-in rake function sh takes care of the return value of the command (the task fails if the command has a return value other than 0) and in addition it also outputs the commands output.


    There are several ways to execute shell commands in ruby. A simple one (and probably the most common) is to use backticks:

    task :hello do
      `echo "World!"`
    end
    

    Backticks have a nice effect where the standard output of the shell command becomes the return value. So, for example, you can get the output of ls by doing

    shell_dir_listing = `ls`
    

    But there are many other ways to call shell commands and they all have benefits/drawbacks and work differently. This article explains the choices in detail, but here's a quick summary possibilities:

  • stdout = %x{cmd} - Alternate syntax for backticks, behind the scenes it's doing the same thing

  • exec(cmd) - Completely replace the running process with a new cmd process

  • success = system(cmd) - Run a subprocess and return true/false on success/failure (based on cmd exit status)

  • IO#popen(cmd) { |io| } - Run a subprocess and connect stdout and stderr to io

  • stdin, stdout, stderr = Open3.popen3(cmd) - Run a subprocess and connect to all pipes (in, out, err)


  • %{echo "World!"} defines a String. I expect you wanted %x{echo "World!"} .

    %x{echo "World!"} executes the command and returns the output (stdout). You will not see the result. But you may do:

    puts %x{echo "World!"}
    

    There are more ways to call a system command:

  • Backticks: `
  • system( cmd )
  • popen
  • Open3#popen3
  • 链接地址: http://www.djcxy.com/p/25284.html

    上一篇: 从ruby脚本进行终端通话

    下一篇: 从Rakefile执行bash命令