通过ruby运行shell命令时的字符串插值?

时间:2016-01-20 21:01:46

标签: ruby shell string-interpolation

在ruby中执行shell命令时,使用字符串插值进行挣扎。你能帮助我找一些我在这里失踪的人吗?

  1. 我的单线程ruby代码跟随任何shortURL的重定向并返回最终的URL。例如,这个ruby代码完全正常。
  2. curl -I https://bit.ly/1mJk8X7 | perl -n -e '/^Location: (.*)$/ && print "$1\n"' 它打印出最终的URL。

    1. 我有一个.txt文件,其中包含一系列短网址,我希望从中获取最终网址的列表。比如说,它被称为shortURLs.txt。我使用IO.foreach遍历文件中的每一行,但我不知道我做错了什么来带来变量' x'进入ruby命令。这是我第一次使用字符串插值,我尝试了各种组合,但没有运气。
    2. IO.foreach("shortURLs.txt") { |x| system "curl -I #{x} | perl -n -e '/^Location: (.*)$/ && print \"$1\n\"' >> finalURLs.txt" }

      我在管道周围收到错误消息' |'符号:

      sh: -c: line 1: syntax error near unexpected token |' sh:-c:第1行:| perl -n -e '/^Location: (.*)$/ && print "https://bit.ly/1mJk8X7'

      其他主题对于string interpolation和正在运行shell commands through ruby非常有用。

2 个答案:

答案 0 :(得分:0)

为了将两个命令传递给shell,您应该运行两次系统命令(检查method 8 in this post

require 'shell'
sh = Shell.new
IO.foreach("shortURLs.txt") { |x| sh.system("curl -I #{x}")  | sh.system("perl -n -e '/^Location: (.*)$/ && print \"$1\n\" ' ") >>  "finalURLs.txt" }

答案 1 :(得分:0)

IO.foreach会在最后生成包含新行的行,以便您实际执行

curl -I https://bit.ly/1mJk8X7
| perl -n -e  ...

这就是您收到语法错误的原因。您可以使用strip删除新行。我认为在将字符串传递给系统之前,print中的\ n也将被替换。您可能对shellwords感兴趣,{{3}}具有在将字符串传递给shell之前转义字符串的函数。

你当然可以完全避开这个问题并使用ruby来获取重定向位置

require 'net/http'
require 'uri'

IO.foreach("shortURLs.txt") do  |url|
  puts Net::HTTP.get_response(URI.parse(url))["Location"]
end