From: akr@... Date: 2014-05-05T13:37:19+00:00 Subject: [ruby-dev:48174] [ruby-trunk - Feature #3348] [Closed] rubyspec: Kernel.spawn redirects both STDERR and STDOUT to the given name ERROR 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 =end -- https://bugs.ruby-lang.org/