【发布时间】:2011-03-02 09:47:22
【问题描述】:
如何将 stderr 和 stdout 重定向到 Ruby 脚本文件?
【问题讨论】:
标签: ruby redirect stdout stderr
如何将 stderr 和 stdout 重定向到 Ruby 脚本文件?
【问题讨论】:
标签: ruby redirect stdout stderr
在 Ruby 脚本中,您可以使用 IO#reopen 方法重定向 stdout 和 stderr。
# 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.sync = true 和$stderr.sync = true。否则,在进程关闭之前不会写出这些行,或者其他类似的东西会刷新流。
注意:将标准流重新打开到 /dev/null 是一种帮助进程成为守护进程的好方法。例如:
# daemon.rb
$stdout.reopen("/dev/null", "w")
$stderr.reopen("/dev/null", "w")
【讨论】:
Process.daemon,它可以为你做到这一点。见docs here。
def silence_stdout
$stdout = File.new( '/dev/null', 'w' )
yield
ensure
$stdout = STDOUT
end
【讨论】:
./yourscript.rb 2>&1 > log.txt
将stdout和stderr重定向到同一个文件。
【讨论】:
> 适用于 Windows - 不过我不确定 2>。
$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"
【讨论】: