我想在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替代方案。
抱歉没有被分成几行,但是否则反引号会混淆。
答案 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命令以混合stdout
和stderr
。
答案 1 :(得分:1)
你的引号太多了。它是指定要执行的操作的最外面的引号,因此像
这样的赋值perlOutput = "`...`"
不会把反推都视为特别的东西;它们将简单地包含在字符串
中然而,反引号或%q{}
将插入变量,就像双引号一样,所以你只想
perlOutput = `perl ... --timeoffset #{timeOffset} ...`