重新打开 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 有帮助,他们认为 STDOUT
是 append
或 write
,而不是 read
.它还可以防止将来更改默认值(通常为 read
),尽管这种情况不太可能发生。事实上 Ruby 可以防止更改 STDIN
或 STDOUT
.
的模式
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
我正在阅读一个示例 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 有帮助,他们认为 STDOUT
是 append
或 write
,而不是 read
.它还可以防止将来更改默认值(通常为 read
),尽管这种情况不太可能发生。事实上 Ruby 可以防止更改 STDIN
或 STDOUT
.
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