Ruby popen和可执行路径?

时间:2014-06-06 18:34:34

标签: ruby shell

执行IO.popenexec时,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中没有这个,所以我的几个脚本都失败了。

2 个答案:

答案 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变量,现在似乎工作正常。