44

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

4

5 に答える 5

67

Ruby スクリプト内から、メソッドを使用してstdoutリダイレクトできます。stderrIO#reopen

# 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
$ 猫 err.txt
stderr への何か
$ cat out.txt
通常出力
于 2010-06-10T21:38:12.267 に答える
13

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

# daemon.rb
$stdout.reopen("/dev/null", "w")
$stderr.reopen("/dev/null", "w")
于 2011-04-13T17:26:19.517 に答える
10
def silence_stdout
  $stdout = File.new( '/dev/null', 'w' )
  yield
ensure
  $stdout = STDOUT
end
于 2012-05-29T23:51:27.057 に答える
4
./yourscript.rb 2>&1 > log.txt

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

于 2010-06-10T21:19:37.140 に答える
1

$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"
于 2020-10-20T00:02:18.577 に答える