重新打开 STDOUT 到 /dev/null 时指定文件模式有什么意义?

What's the significance of specifying a file mode when reopening STDOUT to /dev/null?

我正在阅读一个示例 ruby 脚本,该脚本通过分叉创建守护进程,创建新会话,再次分叉,然后将标准输入、标准输出、标准错误重定向到 /dev/null

这是重定向的片段:

STDIN.reopen '/dev/null'
STDOUT.reopen '/dev/null', 'a'
STDERR.reopen '/dev/null', 'a'

在这种情况下指定文件模式 ('a') 有什么意义?行为是否会有所不同,例如,

STDOUT.reopen '/dev/null', 'w'

甚至

STDOUT.reopen '/dev/null'

?

没有特别的意义,但它在语义上对 reader 有帮助,他们认为 STDOUTappendwrite,而不是 read .它还可以防止将来更改默认值(通常为 read),尽管这种情况不太可能发生。事实上 Ruby 可以防止更改 STDINSTDOUT.

的模式
STDOUT.reopen '/dev/null', 'r'

test.rb:1:in `reopen': <STDOUT> can't change access mode from "w" to "r" (ArgumentError)
from test.rb:1:in `<main>'

虽然这对其他 IOs 有效,但明确说明总是好的。

f = File.open('file.out', 'w')
f.puts 'Hi'
f.close

f.reopen('file.out', 'r')
puts f.read
$ ruby test.rb
Hi