Issue #2715 has been updated by akr (Akira Tanaka).


> .... I realized IO.pid is crazy mistaken feature. It wouldn't work when using complex cmdline even if we will not remove the optimization. Sigh. (+_+

Killing a complex command line, which invokes many processes, is a different problem.
IO#pid is not a origin of the problem.
spawn also have same problem as follows.

  pid = spawn("foo & bar"); Process.kill(:TERM, pid)

Do you say that returning pid feature of spawn is crazy mistaken?

Killing a complex command line needs process group,
as shell job control does.

To return to this issue, I'm considering adding a new spawn option, :shell.
This option disables the optimization.

  system("simple command", :shell=>true)

The default of the option is disabled as now.

This option solves this issue as:
- shell error messages are printed if :shell => true.
- doesn't break programs which expects simple commands are direct child process.
- don't need to implement mimic of shell error message printing feature in ruby.

----------------------------------------
Feature #2715: Optimization to avoid spawning shell in Kernel#system call should check for failure conditions
https://bugs.ruby-lang.org/issues/2715#change-27089

Author: taw (Tomasz Wegrzanowski)
Status: Feedback
Priority: Normal
Assignee: akr (Akira Tanaka)
Category: core
Target version: 


=begin
 This is an old issue, I think going all the way back to Perl's system().
 
 Kernel#system is supposed to spawn shell and pass its argument to shell process just like C system(); except it's optimized for a common case of very simple argument, in which case Ruby (like Perl) simply does fork and exec of the string passed, split on whitespace.
 
 This almost works, except shell error reporting is not duplicated. If command doesn't exist, shell would print an error message on stderr, while Ruby like Perl fails silently.
 
 Problem is present in all versions of Ruby including 1.8.7 and 1.9.1.
 
 To reproduce:
 $ ruby -e 'system "fail"'
 $ ruby -e 'system "\"\"fail"'
 sh: fail: command not found
 
 Output of both commands should be identical (or at least close enough, details of error message might differ by Unix flavor).
 
 rb_f_system code for VMS and Windows uses different code paths, so I don't know if it's also affected or not.
 
 I wrote a bit more about background of this issue on my blog: http://t-a-w.blogspot.com/2010/02/what-is-all-this-perl-doing-in-my-ruby.html
=end



-- 
http://bugs.ruby-lang.org/