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
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