Project

General

Profile

Actions

Feature #2715

closed

Optimization to avoid spawning shell in Kernel#system call should check for failure conditions

Added by taw (Tomasz Wegrzanowski) almost 15 years ago. Updated almost 7 years ago.

Status:
Feedback
Assignee:
-
Target version:
-
[ruby-core:28072]

Description

=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


Files


Related issues 2 (0 open2 closed)

Related to Ruby master - Feature #3426: exec doesn't allow command lines which begin with an env variable assignmentRejectedmame (Yusuke Endoh)06/11/2010Actions
Related to Ruby master - Feature #4477: Kernel:exec and backtick (`) don't work for certain system commandsClosedakr (Akira Tanaka)03/07/2011Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0