Feature #4477

Kernel:exec and backtick (`) don't work for certain system commands

Added by Joachim Wuttke about 4 years ago. Updated almost 3 years ago.

[ruby-core:35446]
Status:Closed
Priority:Normal
Assignee:Akira Tanaka

Description

From documentation and common sense, I would expect that Kernel:exec and backtick (`) work for all kind of system commands. This is currently not the case.

~$ cat test1
echo success
~$ cat test2
#!/bin/sh
echo success
~$ chmod a+x test?
~$ ruby1.8 -e 'p test1'
-e:1: command not found: test1
""
~$ ruby1.9 -e 'p test1'
-e:1:in `': Exec format error - test1 (Errno::ENOEXEC)
from -e:1:in
'
~$ ruby1.8 -e 'p test2'
"success\n"
~$ ruby1.9 -e 'p test2'
"success\n"

This problem has been reported before (#3856: strange Kernel#exec behavior with bash's source command). As a workaround, it has been suggested to append a semikolon to the system command:

~$ ruby1.8 -e 'p test1;'
"success\n"
~$ ruby1.9 -e 'p test1;'
"success\n"

The report #3856 has been closed with the decision "not a bug".

This I cannot accept. For many years, I got used to run system commands through <cmd>. When it failed, I spent painfully long time to search for a bug in my Ruby code and in the system command before I realized the problem was due to an unexpected restriction of Ruby's exec/backtick.


Related issues

Related to Ruby trunk - Feature #2715: Optimization to avoid spawning shell in Kernel#system call should check for failure conditions Feedback 02/06/2010
Related to Ruby trunk - Feature #4269: command with && should execute as shell Closed 01/12/2011

History

#1 Updated by Shota Fukumori about 4 years ago

  • Tracker changed from Bug to Feature

=begin

=end

#2 Updated by Joachim Wuttke about 4 years ago

=begin
Sorry, Shota, I do not understand why you recategorized this issue as a Feature.

The current behaviour of <cmd> contradicts what the documentation says, and it offends common sense. In my understanding, this is clearly a Bug.
=end

#3 Updated by Shota Fukumori about 4 years ago

=begin
I don't think this is Bug because that (Shebang less executing) is you shell's feature. not system's feature.

So this ticket should be Feature request.

=end

#4 Updated by Motohiro KOSAKI about 4 years ago

=begin
2011/3/7 Shota Fukumori sorah@tubusu.net:

Issue #4477 has been updated by Shota Fukumori.

I don't think this is Bug because that (Shebang less executing) is you shell's feature. not system's feature.

No. it is POSIX spec. But, FWIW, This behavior have been changed
intentionally.So, I doubt the issue is a documentation fault.

Currently `don't use shell if command line string don't have
following shell meta characters.
*?{}[]<>()~&|\\$;'
"\n

But, Which documentation describe it?
=end

#5 Updated by Akira Tanaka about 3 years ago

  • Description updated (diff)

#6 Updated by Yusuke Endoh about 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Motohiro KOSAKI

#7 Updated by Yusuke Endoh about 3 years ago

  • Assignee changed from Motohiro KOSAKI to Akira Tanaka

#8 Updated by Kenta Murata about 3 years ago

  • Description updated (diff)

#10 Updated by Akira Tanaka almost 3 years ago

  • Status changed from Assigned to Closed

The feature of shell, invoke /bin/sh after ENOEXEC, is implemented
at r33009 of Ruby.

So this example works now as follows.

% cat test1
echo success
% chmod a+x test1
% ./ruby -ve 'p ./test1'
ruby 2.0.0dev (2012-06-04 trunk 35911) [x86_64-linux]
"success\n"

Also available in: Atom PDF