Feature #3348

rubyspec: Kernel.spawn redirects both STDERR and STDOUT to the given name ERROR

Added by Yusuke Endoh almost 4 years ago. Updated 3 months ago.

[ruby-dev:41430]
Status:Assigned
Priority:Low
Assignee:Yusuke Endoh
Category:-
Target version:current: 2.2.0

Description

=begin
遠藤です。

spawn のリダイレクトの引数で :out => "foo" としたとき、ファイル foo が存在
しなければ作ってくれますが、[:out, :err] => "foo" だと作ってくれません。

ruby -e 'pid = spawn("echo", "foo", [:out, :err] => "foo"); Proces.wait pid'

これは意図的でしょうか。
うっとうしいことに、rubyspec がこの挙動に依存して失敗するようになりました。

配列の中がすべて :out か :err だったら OCREAT|OTRUNC にするパッチです。
反対がなければコミットします。

diff --git a/process.c b/process.c
index 9e52392..4ca6ed3 100644
--- a/process.c
+++ b/process.c
@@ -1342,7 +1342,19 @@ checkexecredirect(VALUE key, VALUE val, VALUE options)
key = checkexecredirectfd(key);
if (FIXNUM
P(key) && (FIX2INT(key) == 1 || FIX2INT(key) == 2))
flags = INT2NUM(OWRONLY|OCREAT|OTRUNC);
- else
+ else if (TYPE(key) == T
ARRAY) {
+ int i;
+ for (i = 0; i < RARRAYLEN(key); i++) {
+ VALUE v = RARRAY
PTR(key)[i];
+ VALUE fd = checkexecredirectfd(v);
+ if (FIX2INT(fd) != 1 && FIX2INT(fd) != 2) break;
+ }
+ if (i == RARRAY
LEN(key))
+ flags = INT2NUM(OWRONLY|OCREAT|OTRUNC);
+ else
+ flags = INT2NUM(O
RDONLY);
+ }
+ else
flags = INT2NUM(ORDONLY);
perm = INT2FIX(0644);
param = hide
obj(rbarynew3(3, hideobj(rbstr_dup(path)),

--
Yusuke Endoh mame@tsg.ne.jp
=end

History

#1 Updated by Akira Tanaka almost 4 years ago

=begin
2010年5月27日5:14 Yusuke ENDOH mame@tsg.ne.jp:

spawn のリダイレクトの引数で :out => "foo" としたとき、ファイル foo が存在
しなければ作ってくれますが、[:out, :err] => "foo" だと作ってくれません。

ruby -e 'pid = spawn("echo", "foo", [:out, :err] => "foo"); Proces.wait pid'

これは意図的でしょうか。
うっとうしいことに、rubyspec がこの挙動に依存して失敗するようになりました。

配列の中がすべて :out か :err だったら OCREAT|OTRUNC にするパッチです。
反対がなければコミットします。

その挙動は悪くないと思いますが、1.9.1 と非互換ですねぇ。
--
[田中 哲][たなか あきら][Tanaka Akira]

=end

#2 Updated by Yusuke Endoh almost 4 years ago

=begin
遠藤です。

2010年5月27日6:54 Tanaka Akira akr@fsij.org:

配列の中がすべて :out か :err だったら OCREAT|OTRUNC にするパッチです。
反対がなければコミットします。

その挙動は悪くないと思いますが、1.9.1 と非互換ですねぇ。

うーん。そうですねえ。

:out => "foo", :err => "foo" はどうなるべきかとか、[:in, :out] => "foo"
には何を期待するのかとか、仕様レベルで検討しないと行けない気がしてきたの
で、ここだけ焦って直す必要はない気がしてきました。
このチケットは 1.9.x にして、今は rubyspec 側を修正しておきます。

--
Yusuke Endoh mame@tsg.ne.jp

=end

#3 Updated by Yui NARUSE almost 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Akira Tanaka
  • Target version set to 2.0.0
  • ruby -v set to 1.9

#4 Updated by Yusuke Endoh about 1 year ago

  • Target version changed from 2.0.0 to next minor

ちゃんとチケット整理しなかったからまた直す機会を逸してしまった。すみません。

Yusuke Endoh mame@tsg.ne.jp

#5 Updated by Akira Tanaka about 1 year ago

  • Assignee changed from Akira Tanaka to Yusuke Endoh

この機能ですが、Ruby 2.1 で minor incompatibilities を許容するならそろそろ入れてもいいんじゃないでしょうか。

#6 Updated by Akira Tanaka about 1 year ago

  • Tracker changed from Bug to Feature

#7 Updated by Motohiro KOSAKI about 1 year ago

この機能ですが、Ruby 2.1 で minor incompatibilities を許容するならそろそろ入れてもいいんじゃないでしょうか。

わたしも入れていいと思います。

#8 Updated by Yui NARUSE about 1 year ago

  • Target version changed from next minor to 2.1.0

#9 Updated by Hiroshi SHIBATA 3 months ago

  • Target version changed from 2.1.0 to current: 2.2.0

Also available in: Atom PDF