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

String interpolation while running shell command through ruby?

在 ruby 中执行 shell 命令时遇到字符串插值问题。有人能帮我找出我在这里遗漏了什么吗?

  1. 我的一行 ruby 代码遵循任何短 URL 和 returns 最终 URL 的重定向。例如,这段 ruby 代码工作得很好。

curl -I https://bit.ly/1mJk8X7 | perl -n -e '/^Location: (.*)$/ && print "\n"' 它打印出最后的 URL.

  1. 我有一个包含一系列短 URL 的 .txt 文件,我想从中导出最终 URL 的列表。比如说,它叫做 shortURLs.txt。我正在使用 IO.foreach 遍历文件中的每一行,但我不知道我在将变量 'x' 带入 ruby 命令时做错了什么。这是我第一次使用字符串插值,我尝试了各种组合,但还没有成功。

IO.foreach("shortURLs.txt") { |x| system "curl -I #{x} | perl -n -e '/^Location: (.*)$/ && print \"\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 and running shell commands through ruby 很有用。

为了将两个命令传递给 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 \"\n\" ' ") >>  "finalURLs.txt" }

IO.foreach 生成包含末尾新行的行,因此您实际上是在执行

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

这就是您遇到语法错误的原因。您可以使用 strip 从中删除新行。我认为 print 调用中的 \n 也会在字符串传递给系统之前被替换。您可能对 shellwords 感兴趣,它具有在将字符串传递给 shell.

之前转义字符串的功能

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

require 'net/http'
require 'uri'

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