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

AOO*_*AOO 41 ruby redirect stdout stderr

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

Mar*_*off 64

Ruby脚本中,您可以重定向stdoutstderrIO#reopen方法.

# a.rb
$stdout.reopen("out.txt", "w")
$stderr.reopen("err.txt", "w")

puts 'normal output'
warn 'something to stderr'
Run Code Online (Sandbox Code Playgroud)
$ ls
a.rb
$ ruby a.rb
$ ls
a.rb    err.txt out.txt
$ cat err.txt 
something to stderr
$ cat out.txt 
normal output

  • 之后如何恢复正常的$ stdout? (2认同)
  • 你需要`$ stdout.sync = true`和`$ stderr.sync = true`如果你希望在写入行时拖尾文件.否则,在进程关闭之前不会写出这些行,或者其他类似的东西会刷新流. (2认同)

arg*_*ith 13

注意:重新打开标准流到/ dev/null是一种帮助进程成为守护进程的好方法.例如:

# daemon.rb
$stdout.reopen("/dev/null", "w")
$stderr.reopen("/dev/null", "w")
Run Code Online (Sandbox Code Playgroud)

  • 在UNIX中,为了使程序成为守护程序,程序员不应仅仅将其分解为后台,而且还要重定向它的标准IO流.你熟悉这个吗? (4认同)
  • "帮助一个过程成为一个守护进程"是什么意思? (3认同)

gro*_*ser 9

def silence_stdout
  $stdout = File.new( '/dev/null', 'w' )
  yield
ensure
  $stdout = STDOUT
end
Run Code Online (Sandbox Code Playgroud)


Ric*_*arn 4

./yourscript.rb 2>&1 > log.txt
Run Code Online (Sandbox Code Playgroud)

将stdout和stderr重定向到同一个文件.

  • 假设您正在运行*nix (4认同)
  • 这个答案还假设用户正在使用什么 shell,即使在 *nix 中也是如此。有些 shell 有不同的重定向样式,例如 zsh 的默认行为。 (2认同)