【问题标题】:Setting input for system() calls in ruby在 ruby​​ 中为 system() 调用设置输入
【发布时间】:2011-06-27 02:32:41
【问题描述】:

我正在尝试使用 net/sftp 下载文件并将其内容作为命令行应用程序的标准输入传递。我可以先将文件写入磁盘,但我宁愿避免这一步。

有什么方法可以控制在 ruby​​ 中使用system() 调用的程序的输入?

【问题讨论】:

    标签: ruby system


    【解决方案1】:

    不要在这种事情上使用systemsystem 最适合运行不需要与之交谈的外部命令。

    使用Open3.open3Open3.open2 为您的外部进程打开一些管道,然后像写入任何其他IO 通道一样写入stdin 管道;如果有任何输出需要处理,那么您可以直接从stdout 管道读取它,就像从任何其他输入 IO 通道读取一样。

    【讨论】:

      【解决方案2】:

      可能是这样的(按照 mu 的建议使用 open)?

      contents = "Hello, World!"
      open('|echo', 'w') { puts contents }
      

      【讨论】:

        【解决方案3】:

        这也可以通过 IO.expect 来完成

        require 'pty'
        require 'expect'
        
        str = "RUBY_VERSION"
        
        PTY.spawn("irb") do |reader, writer|
          reader.expect(/0> /)
          writer.puts(str)
          reader.expect(/=> /)
          answer = reader.gets
          puts "Ruby version from irb: #{answer}"
        end
        

        这会等待生成的进程显示“0>”(irb 提示符的结尾),并且当它看到打印定义的字符串时。然后它通过等待 irb 显示“=>”来寻找返回的数据并获取返回的数据。

        【讨论】:

          猜你喜欢
          • 2010-10-15
          • 1970-01-01
          • 1970-01-01
          • 2023-01-25
          • 2011-04-22
          • 1970-01-01
          • 2015-03-21
          • 2013-02-15
          • 1970-01-01
          相关资源
          最近更新 更多