【问题标题】:Ruby/Rails: pass arguments to command line application from rake taskRuby/Rails:将参数从 rake 任务传递给命令行应用程序
【发布时间】:2012-09-08 01:42:47
【问题描述】:

如何从 rake 任务中传递参数并从 Ruby/Rails 执行命令行应用程序?

具体来说,我正在尝试使用 pdftk(我找不到类似的 gem)将一些 PDF 拆分为单独的页面。我想传递的参数在下面的< > 内:

$ pdftk <filename.pdf> burst output <filename_%04d.pdf>

【问题讨论】:

    标签: ruby-on-rails ruby pdftk


    【解决方案1】:

    在您的 rake 任务的 ruby​​ 代码中:

    `pdftk #{input_filename} burst output #{output_filename}`
    

    你也可以这样做:

    system("pdftk #{input_filename} burst output #{output_filename}")
    

    system() 只返回真或假。反引号或%x() 返回系统调用生成的任何输出。通常首选反引号,但如果您不在乎,则可以使用system()。我总是使用反引号,因为它更简洁。

    更多信息在这里:http://rubyquicktips.com/post/5862861056/execute-shell-commands

    【讨论】:

    • 就这么简单吧?想也许我必须调用一些库来执行命令......猜不!谢谢!
    • 就这么简单。你可以在这里获得更多信息:rubyquicktips.com/post/5862861056/execute-shell-commands
    • 顺便说一句,由于这个原因,我在许多 shell 脚本中使用了 ruby​​。我他妈的讨厌 bash。
    • 不,这是一个系统调用,ruby require 不会有帮助。如果它不起作用,请确保设置了环境变量,以便可以从您调用 rake 任务的任何位置调用 pdftk
    • 如果你想要的话,还更新了我关于system() 的答案。
    【解决方案2】:

    例如如:

    filename = 'filename.pdf'
    filename_out = 'filename_%04d.pdf'
    
    `pdftk #{filename} burst output #{filename_out}`
    

    system("pdftk #{filename} burst output #{filename_out}")
    

    system 返回返回码,反引号版本返回 STDOUT。

    如果需要stdout和stderr,也可以使用Open3.open3:

    filename = 'filename.pdf'
    filename_out = 'filename_%04d.pdf'
    cmd = "pdftk #{filename} burst output #{filename_out}"
    
    require 'open3'
    Open3.popen3(cmd){ |stdin, stdout, stderr|
      puts "This is STDOUT of #{cmd}:"
      puts stdout.read
      puts "This is STDERR of #{cmd}:"
      puts stderr.read
    }
    

    【讨论】:

    • system 函数在做什么?这就是我所期望的……一种风格优于另一种风格的优点/缺点?
    • system() 返回真或假。反引号或%x() 返回系统调用生成的任何输出。通常首选反引号,但如果您不在乎,则可以使用system()。我总是使用反引号,因为它更简洁。
    • 我调整了我的答案并添加了一个带有Open3.popen3 的解决方案来获取标准错误和标准输出。
    猜你喜欢
    • 2010-10-23
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2020-01-01
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多