Ruby 进程“生成结果”;没有这样的文件或目录-打开(Errno::enoint)";

Ruby 进程“生成结果”;没有这样的文件或目录-打开(Errno::enoint)";,ruby,process,io-redirection,Ruby,Process,Io Redirection,是因为我还是Ruby的进程#spawn在将输出重定向到文件时存在错误?说: 因此,我应该能够将键设置为[:out,:err],将值设置为表示文件名的字符串,但是: % ruby -e 'spawn("ps -ef", [:out, :err] => "foo")' -e:1:in `spawn': No such file or directory - open (Errno::ENOENT) from -e:1:in `<main>' 但是,不会向文件写入任

是因为我还是Ruby的
进程#spawn
在将输出重定向到文件时存在错误?说:

因此,我应该能够将键设置为
[:out,:err]
,将值设置为表示文件名的字符串,但是:

% ruby -e 'spawn("ps -ef", [:out, :err] => "foo")'
-e:1:in `spawn': No such file or directory - open (Errno::ENOENT)
        from -e:1:in `<main>'
但是,不会向文件写入任何内容,并且从重定向密钥中删除
:err
证明设置重定向时出错:

% cat foo
% ruby -e 'spawn("ps -ef", [:out] => "foo")' 2>err
% cat err
ps: write error: Bad file descriptor
克服这种怪癖并获得我想要的行为是相当容易的

% rm -f foo
% ruby -e 'Process.waitpid(spawn("ps -ef", [:out, :err] => ["foo", "w"]))'
% wc foo
  503  4422 36470 foo

但由于文档显然与实际行为不符,我已经浪费了30分钟,我很想知道这是一个真正的bug还是我的误解

我的怀疑是,当使用将多个
FD
s分组到一个
数组中的表单时,Ruby停止尝试自动检测是否应该在读模式或写模式下打开
FD
s,而只是在读模式下打开。然后,当进程尝试写入时,该操作失败。当您尝试在同一
数组中混合输入/输出
FD
s时,Ruby没有任何错误甚至警告,这似乎证实了这一点:

% yes | head -n3 > foo
% ruby -e 'Process.waitpid(spawn("wc", [:in, :out] => "foo"))'
wc: write error
% cat foo
y
y
y
% yes | head -n3 > foo
% ruby -e 'Process.waitpid(spawn("wc", [:in, :out] => ["foo"]))'
wc: write error
% cat foo
y
y
y

但是我相信其他人可以提供更好的解释。

是的,it仅自动检测一个源描述符的开放模式。我不认为文档是错误的,它只会在多个描述符被重定向时添加警告以明确指定模式。在不明确的情况下,当指定只读和只读描述符时,您希望看到什么<代码>[:in,:out]=>“some_file.txt”
我希望出现异常,或者至少出现警告。我非常确信文档是错误的(从不完整的意义上说),因为它没有正确地解释开放模式自动检测的工作方式或时间。上述注释中的源链接已断开-请参阅(例如,搜索
“err”
)。
% rm -f foo
% ruby -e 'Process.waitpid(spawn("ps -ef", [:out, :err] => ["foo", "w"]))'
% wc foo
  503  4422 36470 foo
% rm -f foo
% ruby -e 'Process.waitpid(spawn("ps -ef", :out => "foo", :err => :out))'
% wc foo
  503  4422 36470 foo
% yes | head -n3 > foo
% ruby -e 'Process.waitpid(spawn("wc", [:in, :out] => "foo"))'
wc: write error
% cat foo
y
y
y
% yes | head -n3 > foo
% ruby -e 'Process.waitpid(spawn("wc", [:in, :out] => ["foo"]))'
wc: write error
% cat foo
y
y
y