运行 shell 命令通过 ruby 进行字符串插值?
String interpolation while running shell command through ruby?
在 ruby 中执行 shell 命令时遇到字符串插值问题。有人能帮我找出我在这里遗漏了什么吗?
- 我的一行 ruby 代码遵循任何短 URL 和 returns 最终 URL 的重定向。例如,这段 ruby 代码工作得很好。
curl -I https://bit.ly/1mJk8X7 | perl -n -e '/^Location: (.*)$/ && print "\n"'
它打印出最后的 URL.
- 我有一个包含一系列短 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
在 ruby 中执行 shell 命令时遇到字符串插值问题。有人能帮我找出我在这里遗漏了什么吗?
- 我的一行 ruby 代码遵循任何短 URL 和 returns 最终 URL 的重定向。例如,这段 ruby 代码工作得很好。
curl -I https://bit.ly/1mJk8X7 | perl -n -e '/^Location: (.*)$/ && print "\n"'
它打印出最后的 URL.
- 我有一个包含一系列短 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