Forum: Ruby-dev [Closed] rubyspec: Kernel.spawn redirects both STDERR and STDOUT to the given name ERROR

B11f10c4cd9d53970e7be20caa43f940?d=identicon&s=25 unknown (Guest)
on 2014-05-05 15:37
(Received via mailing list)
Issue #3348 has been updated by Akira Tanaka.

Status changed from Assigned to Closed
% Done changed from 0 to 100

Applied in changeset r45828.

----------
* process.c (check_exec_redirect): Open the file in write mode for
  redirect from [:out, :err].
  Proposed and implemented by Yusuke Endoh.
  [ruby-dev:41430] [Feature #3348]

----------------------------------------
Feature #3348: rubyspec: Kernel.spawn redirects both STDERR and STDOUT
to the given name ERROR
https://bugs.ruby-lang.org/issues/3348#change-46542

* Author: Yusuke Endoh
* Status: Closed
* Priority: Low
* Assignee: Yusuke Endoh
* Category:
* Target version: current: 2.2.0
----------------------------------------
=begin
 遠藤です。

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

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

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

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


 diff --git a/process.c b/process.c
 index 9e52392..4ca6ed3 100644
 --- a/process.c
 +++ b/process.c
 @@ -1342,7 +1342,19 @@ check_exec_redirect(VALUE key, VALUE val, VALUE
options)
              key = check_exec_redirect_fd(key);
          if (FIXNUM_P(key) && (FIX2INT(key) == 1 || FIX2INT(key) == 2))
              flags = INT2NUM(O_WRONLY|O_CREAT|O_TRUNC);
 -        else
 +        else if (TYPE(key) == T_ARRAY) {
 +      int i;
 +      for (i = 0; i < RARRAY_LEN(key); i++) {
 +    VALUE v = RARRAY_PTR(key)[i];
 +    VALUE fd = check_exec_redirect_fd(v);
 +    if (FIX2INT(fd) != 1 && FIX2INT(fd) != 2) break;
 +      }
 +      if (i == RARRAY_LEN(key))
 +    flags = INT2NUM(O_WRONLY|O_CREAT|O_TRUNC);
 +      else
 +    flags = INT2NUM(O_RDONLY);
 +  }
 +  else
              flags = INT2NUM(O_RDONLY);
          perm = INT2FIX(0644);
          param = hide_obj(rb_ary_new3(3, hide_obj(rb_str_dup(path)),

 --
 Yusuke Endoh <mame@tsg.ne.jp>
=end
This topic is locked and can not be replied to.