在ruby中执行shell命令时,使用字符串插值进行挣扎。你能帮助我找一些我在这里失踪的人吗?
curl -I https://bit.ly/1mJk8X7 | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
它打印出最终的URL。
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非常有用。
答案 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