如何将stderr和stdout重定向到文件以获取Ruby脚本?
答案 0 :(得分:61)
从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 $ cat err.txt something to stderr $ cat out.txt normal output
答案 1 :(得分:13)
注意:重新打开标准流到/ dev / null是帮助进程成为守护进程的一种很好的老方法。例如:
# daemon.rb
$stdout.reopen("/dev/null", "w")
$stderr.reopen("/dev/null", "w")
答案 2 :(得分:9)
def silence_stdout
$stdout = File.new( '/dev/null', 'w' )
yield
ensure
$stdout = STDOUT
end
答案 3 :(得分:5)
./yourscript.rb 2>&1 > log.txt
会将stdout和stderr重定向到同一个文件。
答案 4 :(得分:0)
将$ 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"