Project

General

Profile

Actions

Bug #8004

closed

spawn does not honor its passed PATH

Bug #8004: spawn does not honor its passed PATH

Added by josh.cheek (Josh Cheek) over 13 years ago. Updated almost 10 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
[ruby-core:53103]

Description

#!/bin/sh

# make an executable
  echo '#!/usr/bin/env ruby' >  my_bin
  echo 'puts "omg"'          >> my_bin
  chmod +x my_bin


# run it in 1.9
  ruby1.9 -v
    # >> ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin12.2.0]

  ruby1.9 -r open3 -e 'p Open3.capture3({"PATH" => ".:#{ENV["PATH"]}"}, "my_bin")'
    # >> ["omg\n", "", #<Process::Status: pid 30556 exit 0>]

# run it in 2.0
  ruby2 -v
    # >> ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]

  ruby2 -r open3 -e 'p Open3.capture3({"PATH" => ".:#{ENV["PATH"]}"}, "my_bin")'
    # >> /Users/joshcheek/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open3.rb:211:in `spawn': No such file or directory - my_bin (Errno::ENOENT)
    # >>   from /Users/joshcheek/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open3.rb:211:in `popen_run'
    # >>   from /Users/joshcheek/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open3.rb:99:in `popen3'
    # >>   from /Users/joshcheek/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/open3.rb:279:in `capture3'
    # >>   from -e:1:in `<main>'

  # the above fails, but this one works
  ruby2 -r open3 -e 'ENV["PATH"] = ".:#{ENV["PATH"]}"; p Open3.capture3("my_bin")'
    # >> ["omg\n", "", #<Process::Status: pid 30556 exit 0>]

  # it is setting the path, though, so idk what the problem is
  ruby2 -r open3 -e 'p Open3.capture3({"PATH" => ".:#{ENV["PATH"]}"}, "echo $PATH")'
    # >> [".:/Users/joshcheek/.rbenv/shims: ...

Updated by josh.cheek (Josh Cheek) over 13 years ago Actions #1 [ruby-core:53104]

Did some more digging, it seems to be a bug in Process.spawn:

#!/bin/sh

cat script.rb
  # >> File.write 'my_bin', 'echo "WORKS"'
  # >> File.chmod 0755, 'my_bin'
  # >>
  # >> puts "CWD: #{Dir.pwd}"
  # >> Process.spawn({'PATH' => ".:#{ENV['PATH']}"}, 'my_bin')


ruby1.9 -v
  # >> ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin12.2.0]
ruby1.9 script.rb
  # >> CWD: /Users/joshcheek/deleteme/ruby2-bug-test
  # >> WORKS

ruby2 -v
  # >> ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]

ruby2 script.rb
  # >> CWD: /Users/joshcheek/deleteme/ruby2-bug-test
  # >> script.rb:5:in `spawn': No such file or directory - my_bin (Errno::ENOENT)
  # >>   from script.rb:5:in `<main>'

Updated by josh.cheek (Josh Cheek) almost 10 years ago Actions #2 [ruby-core:77858]

On my computer, the reason for this is:

It should have found the path here: https://github.com/ruby/ruby/blob/c7e99cbfc8dea00ffa5d0a286ea484e90e789df4/process.c#L2193

But notice the second argument, 0, which causes dln_find_exe_r to look at the environment variables to get the PATH, and thus the PATH that is set in eargp is not used.

Updated by shyouhei (Shyouhei Urabe) almost 10 years ago Actions #3 [ruby-core:77859]

  • Subject changed from Open3 not finding binaries when PATH env var is passed as first arg to spawn does not honor its passed PATH

Updated by nobu (Nobuyoshi Nakada) almost 10 years ago Actions #4

  • Status changed from Open to Closed

Applied in changeset r56618.


process.c: PATH env in spawn

Updated by nobu (Nobuyoshi Nakada) almost 10 years ago Actions #5 [ruby-core:78010]

  • Description updated (diff)
Actions

Also available in: PDF Atom