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

时间:2010-06-10 21:17:32

标签: ruby redirect stdout stderr

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

5 个答案:

答案 0 :(得分:61)

从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
$ 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"