【发布时间】: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
如何从 rake 任务中传递参数并从 Ruby/Rails 执行命令行应用程序?
具体来说,我正在尝试使用 pdftk(我找不到类似的 gem)将一些 PDF 拆分为单独的页面。我想传递的参数在下面的< > 内:
$ pdftk <filename.pdf> burst output <filename_%04d.pdf>
【问题讨论】:
标签: ruby-on-rails ruby pdftk
在您的 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
【讨论】:
require 不会有帮助。如果它不起作用,请确保设置了环境变量,以便可以从您调用 rake 任务的任何位置调用 pdftk
system() 的答案。
例如如:
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 函数在做什么?这就是我所期望的……一种风格优于另一种风格的优点/缺点?
%x() 返回系统调用生成的任何输出。通常首选反引号,但如果您不在乎,则可以使用system()。我总是使用反引号,因为它更简洁。
Open3.popen3 的解决方案来获取标准错误和标准输出。