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

Issue #3348 has been updated by mame (Yusuke E.).

Target version changed from 2.0.0 to next minor

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


Yusuke E. [email protected]

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

Author: mame (Yusuke E.)
Status: Assigned
Priority: Low
Assignee: akr (Akira T.)
Category:
Target version: next minor
ruby -v: 1.9

=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 E. [email protected]
=end

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs