执行IO.popen
或exec
时,Ruby从哪里获取默认的PATH变量?
例如在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-install进行自定义安装。
Homebrew在/ usr / local / bin中安装了很多应用程序,因为ruby在PATH中没有这个,所以我的几个脚本都失败了。
答案 0 :(得分:2)
它从你给它的环境中获取PATH,所以给它一个:
IO.popen(ENV, "echo $PATH").read.chomp
或
new_env = {'PATH' => '/path/to/foo'}
IO.popen(new_env, "echo $PATH").read.chomp
例如:
IO.popen({'PATH' => 'foo'},"echo $PATH").read.chomp
# => "foo"
这是the documentation中的第一个参数:
popen([env,] cmd, mode="r" [, opt]) → io
popen([env,] cmd, mode="r" [, opt]) {|io| block } → obj
没有明确说明,但这就是这个意思:
数组最初可以包含环境的哈希值,最后可以包含与spawn类似的选项的哈希值。
如果您没有传递环境信息,Ruby将使用传递给它的默认ENV
哈希来创建环境。我认为这是一个安全选择,允许您限制访问,或更改被调用代码的环境信息。
=> "/usr/bin:/bin:/usr/sbin:/sbin"
看起来像root用户看到的内容。通常root运行路径非常有限。
答案 1 :(得分:1)
发现了这个问题。显然,ENV不是哈希,而是对象。
我有两个PATH,所以ENV有两个带PATH的键(我不知道这是可能的)。 删除了最后一个PATH变量,现在似乎工作正常。