Kernel.exec not behaving consistently on Windows?

J

Jarmo Pertman

Hello!

It seems that Kernel.exec doesn't work consistently on Windows when
compared with Kernel.system or IO.popen. Consider the following
examples:

This works:
exec "ping", "localhost"

This doesn't work:
exec "ping.exe", "localhost"
Errno::ENOENT: No such file or directory - ping.exe

This works:
exec "c:\\windows\\system32\\ping.exe", "localhost"

This doesn't work:
exec "c:\\windows\\system32\\ping", "localhost"
Errno::ENOENT: No such file or directory - c:\windows\system32\ping

When invoking exec always with only one parameter then all the
examples above work correctly - e.g. with allowing Ruby to do the
shell expansion which isn't changing for the examples above anything.
Also, Windows shell doesn't do any expansion either since there isn't
such a thing.

Why is it like that? The problem is that Bundler uses
"Kernel.exec(*ARGV)" which makes `bundle exec` to fail here and there
(for example autotest within Rails3). What possible solution is there
to fix that issue once and for all?

I've opened a bug in Bundler's repo, which is now closed due no good
solutions or just a matter of opinions that this bug is not Bundler's.
Maybe this is a bug of Ruby instead and if it's not then should it be
fixed within Bundler or within every other library. I'd bet for
Bundler since that is one of the central places which every other
library might use, even if the bug is Ruby's.

And if that all is expected behavior then what should be the solution.

By the way, all examples above seem to be working fine on 1.9 MRI, but
fail on 1.8 MRI.

Jarmo Pertman
 
L

Luis Lavena

Hello!

It seems that Kernel.exec doesn't work consistently on Windows when
compared with Kernel.system or IO.popen. Consider the following
examples:

This works:
exec "ping", "localhost"

This doesn't work:
exec "ping.exe", "localhost"
Errno::ENOENT: No such file or directory - ping.exe

This works:
exec "c:\\windows\\system32\\ping.exe", "localhost"

This doesn't work:
exec "c:\\windows\\system32\\ping", "localhost"
Errno::ENOENT: No such file or directory - c:\windows\system32\ping

By the way, all examples above seem to be working fine on 1.9 MRI, but
fail on 1.8 MRI.

Ruby 1.8.x Kernel#exec is broken. The changes required to fix this
were so radical that couldn't be backported from 1.9.x to 1.8.x

Rake for example workaround this:

https://github.com/jimweirich/rake/blob/master/lib/rake/alt_system.rb
 
J

Jarmo Pertman

But Rake only handles system and backticks - is the problem same with
exec?

Jarmo
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,818
Latest member
SapanaCarpetStudio

Latest Threads

Top