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"