【问题标题】:How do I redirect stderr and stdout to file for a Ruby script?如何将 stderr 和 stdout 重定向到 Ruby 脚本文件?
【发布时间】:2011-03-02 09:47:22
【问题描述】:

如何将 stderr 和 stdout 重定向到 Ruby 脚本文件?

【问题讨论】:

标签: ruby redirect stdout stderr


【解决方案1】:

在 Ruby 脚本中,您可以使用 IO#reopen 方法重定向 stdoutstderr

# a.rb
$stdout.reopen("out.txt", "w")
$stderr.reopen("err.txt", "w")

puts 'normal output'
warn 'something to stderr'
$ ls a.rb $ ruby​​ a.rb $ ls a.rb err.txt out.txt $猫错误.txt 标准错误的东西 $ cat out.txt 正常输出

【讨论】:

  • 之后如何恢复正常的$stdout?
  • 为什么要使用reopen方法?意思是如果“out.txt”不存在就创建?
  • 看看this answer之后如何恢复$stdout。
  • 如果您希望在写入行时跟踪文件,则需要$stdout.sync = true$stderr.sync = true。否则,在进程关闭之前不会写出这些行,或者其他类似的东西会刷新流。
【解决方案2】:

注意:将标准流重新打开到 /dev/null 是一种帮助进程成为守护进程的好方法。例如:

# daemon.rb
$stdout.reopen("/dev/null", "w")
$stderr.reopen("/dev/null", "w")

【讨论】:

  • “帮助进程成为守护进程”是什么意思?
  • 在 UNIX 中,为了使程序成为守护进程,程序员不仅应该将其分叉到后台,还应该重定向它的标准 IO 流。你熟悉这个吗?
  • 注意:如果使用内置的Process.daemon,它可以为你做到这一点。见docs here
【解决方案3】:
def silence_stdout
  $stdout = File.new( '/dev/null', 'w' )
  yield
ensure
  $stdout = STDOUT
end

【讨论】:

【解决方案4】:
./yourscript.rb 2>&1 > log.txt

将stdout和stderr重定向到同一个文件。

【讨论】:

  • 假设你在 *nix 上运行
  • @Steve:我认为> 适用于 Windows - 不过我不确定 2>
  • 这个答案还对用户使用的 shell 做出了假设,即使在 *nix 中也是如此。一些 shell 有不同的重定向样式,例如 zsh 的默认行为。
【解决方案5】:

$stdout 和 $stderr 重定向到文件的完整示例以及如何恢复初始行为。

#!/usr/bin/ruby

logfile = "/tmp/testruby.log"

@original_stdout = $stderr.dup
@original_stderr = $stderr.dup
$stdout.reopen(logfile, "w")
$stdout.sync = true
$stderr.reopen($stdout)


def restore_stdout
  $stdout.reopen(@original_stdout)
  $stderr.reopen(@original_stderr)
end

def fail_exit(msg)
  puts "- #{msg}" # to the logfile
  restore_stdout
  $stderr.puts "+ #{msg}" # to standard error
  exit!
end

def success_exit(msg)
  puts "- #{msg}" # to the logfile
  restore_stdout  
  $stdout.puts "+ #{msg}" # to standard output
  exit
end

puts "This message goes to the file"

success_exit "A successful exit message"

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2011-11-23
    • 2011-12-15
    • 2016-03-29
    • 2021-08-19
    相关资源
    最近更新 更多