【问题标题】:How to capture the output of a command without it displaying in stdout如何捕获命令的输出而不显示在标准输出中
【发布时间】:2016-12-22 01:52:07
【问题描述】:

如果命令没有显示在标准输出中,如何捕获命令的输出并检查它的内容?例如:

  def update!
      `git pull origin master`
      if $?.exitstatus > 0
        puts 'Failed to update'
      elsif $?.success?
        puts 'Upgraded successfully'
      else
        puts 'Already up to date'
      end
    end

如何捕获此输出以检查命令是否显示up-to date、发生错误或成功更新?有没有办法将输出写入文件而不是控制台?


更新答案:

def update!
  update_status = `git pull origin master 2>&1`
  if $?.exitstatus > 0
    puts 'error'
  elsif update_status =~ /Already up-to date/
    puts 'same version as origin master'
  else
    puts 'updated'
  end
end

此输出将始终为:

[06:44:29 INFO] Updating to newest version..
updated

即使版本与起源相同。如果可能的话,我想做的是将命令的stdout 保存到文件中并从该文件中读取以发现程序是否已更新。我认为这是最简单的方法。

【问题讨论】:

  • 你想为你的方法写测试吗?
  • @sagarpandya82 不,我正在尝试为我编写的程序获取更新方法,并希望捕获 git 本身的输出。我只是不知道是否可以将输出写入文件

标签: ruby git stdout ruby-2.3


【解决方案1】:

您可以将命令的输出分配给字符串。

使用2>&1 将stderr 重定向到stdout,从而捕获所有输出。

str = `git pull origin master 2>&1`
if $?.exitstatus > 0
  ...
elsif str =~ /up-to-date/
  ...
else
  ...
end

【讨论】:

  • 这行不通,当git 已经是最新的时,它会以状态0 退出,所以else 没用
  • 我需要以某种方式捕获信息并检查它是否显示updatingup-to date 或某种错误
  • 知道了,正在更新!
  • 谢谢!非常感谢
  • 这仍然会输出命令* branch master -> FETCH_HEAD 我试图阻止它显示
猜你喜欢
  • 2018-02-21
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多