web-dev-qa-db-ja.com

Rubyスクリプト用にstderrとstdoutをファイルにリダイレクトするにはどうすればよいですか?

Rubyスクリプト用にstderrとstdoutをファイルにリダイレクトするにはどうすればよいですか?

41
AOO

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 
 someder to stderr 
 $ cat out.txt 
 normal output 
64
Mark Rushakoff

注:標準ストリームを/ dev/nullに再度開くことは、プロセスがデーモンになるのを助ける古き良き方法です。例えば:

# daemon.rb
$stdout.reopen("/dev/null", "w")
$stderr.reopen("/dev/null", "w")
13
argent_smith
def silence_stdout
  $stdout = File.new( '/dev/null', 'w' )
  yield
ensure
  $stdout = STDOUT
end
9
grosser
./yourscript.rb 2>&1 > log.txt

stdoutとstderrを同じファイルにリダイレクトします。

4
Richard Fearn