【问题标题】:How do I get wget output in ruby?如何在 ruby​​ 中获得 wget 输出?
【发布时间】:2017-10-04 16:08:23
【问题描述】:

我需要从 ruby​​ 运行以下代码:

system "wget http://example.org/some/large/archive.zip"

当我运行这个命令时,我看到了

将输出重定向到“wget-log”。

我需要tail -f wget-log 才能看到进度

如何在运行 ruby​​ 进程的终端中查看 wget 输出?

我试过了

system "wget -O - http://example.org/some/large/archive.zip > dev/null"

但没用

也许还有其他选项可以使用 ruby​​ 下载大型档案并查看进度?

【问题讨论】:

    标签: ruby stdout wget


    【解决方案1】:

    您可以使用 Ruby 标准库中的 Open3 模块。

    授予您访问标准输出、标准错误、退出代码和线程以在运行另一个程序时等待子进程

    因此,拥有pwd 命令,您可以执行以下操作:

    require 'open3'
    stdout, stderr, status = Open3.capture3('pwd')
    puts stdout # ~/ current directory
    puts stderr #    no error
    puts status # pid 25522 exit 0
    

    【讨论】:

    • Open3.capture3 不适用于我的 wget。它与Open3.capture2('wget http://example.org/some/large/archive.zip') 合作
    • 是的,略有不同。
    【解决方案2】:

    ruby 提供了一个很好的内置库来制作任何类型的 http 东西,例如下载文件你可以使用net/http:

    require 'net/http'
    require 'uri'
    
    uri = URI(URI.encode("http://example.org/some/large/archive.zip"))
    Net::HTTP.start(uri.host,uri.port) do |http|
      request = Net::HTTP::Get.new uri.path
    
      http.request request do |response|
        open "/tmp/my_large_file.zip", 'w' do |io|
           response.read_body do |chunk|
             puts "Writing  #{chunk.length} bits ..." # see progress
             io.write chunk
           end
         end
      end  
    end
    

    使用wget您无法在您的 ruby​​ 代码中捕获任何类型的 http 错误。*

    使用wget你无法进行身份验证,例如在你的 ruby​​ 代码中是基本的。*

    使用 Ruby 内置库,非常强大。

    你可以,但有一些错误代码

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2019-06-14
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多