使用Ruby varibles从Ruby调用Perl脚本

时间:2017-01-14 23:58:36

标签: ruby perl shell

我想在Perl脚本中包含一个变量,我是从Ruby脚本调用的。以下不起作用。似乎什么也没发生。我捕获输出并不重要,但它在没有2>&1的情况下也不起作用。

两个脚本的区别在于--timeoffset #{timeOffset}包含在第一个脚本中。在第二个#{timeOffset}28000取代。双引号不在第二个。当然,评估变量需要双引号,否则它只是文本转到Perl。

perlOutput = "`perl '/Users/gscar/Documents/Ruby/Photo\ handling/lib/gpsPhoto.pl' --dir '/Volumes/Knobby Aperture Two/_Download\ folder/Latest\ Download/' --gpsdir '/Users/gscar/Dropbox/\ GPX\ daily\ logs/2017\ Massaged/' --timeoffset #{timeOffset} --maxtimediff 50000 2>&1` "

这确实有效,简单的反向输入,没有Ruby变量

perlOutput = `perl '/Users/gscar/Documents/Ruby/Photo\ handling/lib/gpsPhoto.pl' --dir '/Volumes/Knobby Aperture Two/_Download\ folder/Latest\ Download/' --gpsdir '/Users/gscar/Dropbox/\ GPX\ daily\ logs/2017\ Massaged/' --timeoffset 28800 --maxtimediff 50000`

Perl脚本运行良好,并且不了解任何Ruby替代方案。

抱歉没有被分成几行,但是否则反引号会混淆。

2 个答案:

答案 0 :(得分:2)

正如Borodin指出的那样,您的问题是错误的报价。但是,有一种更好的方法来处理这类事情,完全避免所有引用和转义以及shell问题,这种方式是使用标准库中的Open3。类似的东西:

perlOutput, _ = Open3.capture2(
  'perl',
  '/Users/gscar/Documents/Ruby/Photo handling/lib/gpsPhoto.pl',
  '--dir',
  '/Volumes/Knobby Aperture Two/_Download folder/Latest Download/',
  '--gpsdir',
  '/Users/gscar/Dropbox/ GPX daily logs/2017 Massaged/',
  '--timeoffset',
  timeOffset.to_s,
  '--maxtimediff',
  50000.to_s
)

这将为您提供perlOutput中的输出以及_中进程的存在状态(您也可以说perlOutput, = ...但我发现显式丢弃_更清晰阅读)。没有涉及shell,因此不需要额外的转义。

如果您也需要stderr,请使用Open3.capture3而不是将2>&1附加到shell命令以混合stdoutstderr

答案 1 :(得分:1)

你的引号太多了。它是指定要执行的操作的最外面的引号,因此像

这样的赋值
perlOutput = "`...`"

不会把反推都视为特别的东西;它们将简单地包含在字符串

然而,反引号或%q{} 插入变量,就像双引号一样,所以你只想

perlOutput = `perl ... --timeoffset #{timeOffset} ...`