【问题标题】:Curl command being printed instead of stored in Ruby打印卷曲命令而不是存储在 Ruby 中
【发布时间】:2017-11-28 00:05:55
【问题描述】:

当我运行这个简单的 ruby​​ 脚本时:

a = `curl localhost`
puts "Result is: #{a}"


=> % Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
=> 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--    0curl: (7) Failed to connect to localhost port 80: Connection refused
=> Result is:

看到运行命令时正在打印结果,并且变量为空。但是,如果我以相同的格式运行任何其他命令,它会按预期工作:

a = `ls`
puts "Result is: #{a}"

=> Result is: test.rb

如何将第一个 curl 命令的结果存储到变量中?

【问题讨论】:

    标签: ruby shell variables curl backticks


    【解决方案1】:

    来自man curl

    curl 在操作过程中通常会显示一个进度表,此数据 默认显示到终端...如果你想要一个进度 用于 HTTP POST 或 PUT 请求的仪表,您需要重定向响应 使用 shell 重定向 (>)、-o、--output 或类似方法输出到文件。

    使用反引号时发生的情况是它只获取命令的标准输出(stdout)。

    如果您需要 curl 输出,可以使用 -o 选项,这将创建一个包含输出的文件,然后您可以根据需要使用它。

    `curl localhost -o curl_localhost_output.txt`
    puts File.read('path-to-file/curl_localhost_output.txt')
    

    还存在将 stderr 重定向到 stdout 的“方法”,但不是重定向到 stdout,而是重定向到名为 1 的文件,因此您可以使用 curl localhost 2>&1 并存储 curl 输出,而无需创建和读取文件.

    【讨论】:

    • 感谢您的解释。根据您提供的信息,我测试了a = `curl localhost 2>&1` ,它可以按预期工作,无需从文件中读取。您可以将此添加到您的答案中,以便我接受吗
    • curl -s localhost 将使进度表静音,并且很好地为您提供标准输出中的响应正文。无需重定向恶作剧。此外,require 'open-uri'; a = open('http://localhost') { |f| f.read } 是纯 Ruby 等价物。
    • 嗨@Amadan,我试过curl -s localhost,这确实使进度表静音,但不会为我将任何内容重定向到标准输出
    • 它不会重定向 - 它只是按照正常的 curl 行为将 URL 内容打印到标准输出。如果你没有从foo = `curl -s localhost` 得到任何东西,你的本地主机可能没有什么可说的:P
    • 很公平,我实际上希望得到curl: (52) Empty reply from server 的响应,该响应正被curl -s localhost 压制,因此该解决方案不适用于我的情况。抱歉,我没有在原始问题中指定。
    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2021-10-07
    • 2021-10-05
    相关资源
    最近更新 更多