Ruby popen和可执行路径?

Ruby popen和可执行路径?,ruby,shell,Ruby,Shell,当执行IO.popen或exec时,Ruby从何处获取默认路径变量 例如,在zsh中: echo $PATH /Users/bibstha/.rubies/ruby-2.1.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 确认irb中的ENV['PATH']: irb(main):026:0> ENV['PATH'] => "/Users/bibstha/.rubies/ruby-2.1.1/bin:/usr/local/bin

当执行
IO.popen
exec
时,Ruby从何处获取默认路径变量

例如,在zsh中:

echo $PATH
/Users/bibstha/.rubies/ruby-2.1.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
确认irb中的
ENV['PATH']

irb(main):026:0> ENV['PATH']
=> "/Users/bibstha/.rubies/ruby-2.1.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
但不能使用
popen

irb(main):024:0> IO.popen("echo $PATH").read.chomp
=> "/usr/bin:/bin:/usr/sbin:/sbin"
更新

我用OSX Yosemite(10.10)发布的ruby以及ruby安装的自定义安装尝试了这一点


Homebrew在/usr/local/bin中安装了许多应用程序,由于ruby在路径中没有此项,我的两个脚本都失败了。

它从您提供的环境中获取路径,因此为它提供一个:

IO.popen(ENV, "echo $PATH").read.chomp

例如:

IO.popen({'PATH' => 'foo'},"echo $PATH").read.chomp
# => "foo"
这是中的第一个参数:

虽然没有明确规定,但这意味着:

数组可以首先包含环境的哈希值,最后包含类似于spawn的选项的哈希值

如果不传递环境信息,Ruby将使用传递给它的默认
ENV
散列来创建环境。我认为这是一种安全选择,允许您限制访问,或更改被调用代码的环境信息

=> "/usr/bin:/bin:/usr/sbin:/sbin"

看起来像根用户看到的。通常,root运行的路径非常受限。

发现了问题。显然,ENV不是散列而是一个对象

我有两个路径,所以ENV有两个路径键(我不知道这是可能的)。
删除了最后一个PATH变量,现在似乎工作正常。

我使用的是rbenv和IO.popen(“echo$PATH”)。read.chomp和ENV['PATH']完全相同,但shell中的echo$PATH不同。如果使用.bashrc或.zshrc更新$PATH,它是否会被IO.popen(“echo$PATH”)获取?这是OSX中的正常用户帐户。我也更新了问题。我不明白答案的安全部分。你能详细说明一下吗?
popen([env,] cmd, mode="r" [, opt]) → io 
popen([env,] cmd, mode="r" [, opt]) {|io| block } → obj
=> "/usr/bin:/bin:/usr/sbin:/sbin"