Bug #7489

Kernel.spawn sometimes executes string directly

Added by Julius Caesar over 1 year ago. Updated about 1 year ago.

[ruby-core:50459]
Status:Closed
Priority:Normal
Assignee:Akira Tanaka
Category:doc
Target version:next minor
ruby -v:ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux] Backport:

Description

Kernel.spawn throws an exception in certain cases where it shouldn't.
It seems to attempt to execute the command directly, rather than passing
it to the shell.

See the demo script below. What should happen, when I run this script,
is that both assertions should fail, and there should be an error message
from the testing framework about each test. What actually happens is
that both tests pass and the test framework reports success.

#-------------------------------
require 'test/unit'

class TestSpawn < Test::Unit::TestCase
#> either command would work fine if executed
# in the shell.

def test1
assert_raises(Errno::ENOENT) { spawn ':' }
end

def test2
assert_raises(Errno::ENOENT) { spawn 'a=b true' }
end
end
#-------------------------------

My compiler is GCC, and the output of "gcc --version" is:

gcc-4.4.real (Debian 4.4.5-8) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Please note that I have attached my rbconfig.rb file.

rbconfig.rb Magnifier - The rbconfig.rb file for the ruby version I'm using (8.4 KB) Julius Caesar, 12/02/2012 02:58 AM

Associated revisions

Revision 40083
Added by Akira Tanaka about 1 year ago

  • process.c: Describe the behavior which Ruby invokes a commandline directly without shell if the commandline is simple enough. [Bug #7489]

History

#1 Updated by Akira Tanaka over 1 year ago

2012/12/2 jcaesar (Julius Caesar) redmine@ruby-lang.org:

Bug #7489: Kernel.spawn sometimes executes string directly
https://bugs.ruby-lang.org/issues/7489

Kernel.spawn throws an exception in certain cases where it shouldn't.
It seems to attempt to execute the command directly, rather than passing
it to the shell.

Ruby invokes simple commands, command line without meta characters, directly
without shell. This behavior is inherited from Perl.

We cannot remove the behavior because people assumes pid returned from
Kernel.spawn (and IO#pid for IO.popen) is the pid of invoked simple command.
If we use always invoke a command via shell, people will find they cannot
kill the command because returned pid will be the pid of shell, not the command.

However, Ruby 2.0 refines the algorithm to use shell or not.
So, your example will fail as you expected.
--
Tanaka Akira

#2 Updated by Julius Caesar over 1 year ago

Thanks for the response. My only comment is that the
behaviour you describe is not documented (unless I'm
missing something), and should be.

By the way, I was unaware of your reply until a short
time ago. For some reason, I was never notified
by email.

#3 Updated by Koichi Sasada about 1 year ago

  • Category set to doc
  • Assignee set to Akira Tanaka
  • Target version set to next minor

Akr-san, could you add a documentation?

#4 Updated by Akira Tanaka about 1 year ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r40083.
Julius, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • process.c: Describe the behavior which Ruby invokes a commandline directly without shell if the commandline is simple enough. [Bug #7489]

Also available in: Atom PDF