Ruby 奇怪的环境变量,是不是 ruby 的 bug 啊?

wongyouth · 2013年08月01日 · 最后由 linjunhalida 回复于 2013年08月02日 · 4520 次阅读

请看下面的例子,在你的终端试下看,想了一个晚上都没有想通理由。

ruby -e "puts ENV['USERNAME']"

结果是没有输出 因为我的环境变量里面没有设置 USERNAME,所以返回空是正常的。

USERNAME=a ruby -e "puts ENV['USERNAME']" 
#=> 登陆用户名

结果输出了我的用户名,而不是这里设置的环境变量a,很是诡异,因为没有哪个地方设置这个值。

USER=a ruby -e "puts ENV['USER']"
#=> a

换一个变量用 USER 反而正常了。 我的环境变量里面 USER 自动被设置为登录名。 说明虽然环境变量有值,但是命令行中设置的值可以重置它。

在系统自带 /usr/bin/ruby, 与 rbenv 都试过,问题同样! 用 mac,linux 都试了,没有不同! 在 ruby1.8, 1.9, 2.0 都试了没有变化!

这是 ruby 的 bug 吗,哪位能解释一下?

Mac Ruby 2.0 一切正常

就是这样的...

USERNAME=a echo $USERNAME

@luikore USER=a echo $USERUSER=a ruby -e "puts ENV['USER']" 结果是不同的。

命令行前设置的值重置掉默认的环境变量才正常

@ngn999 以前好像是好的,不知道为什么今天就出问题了。

#3 楼 @wongyouth USER 和 USERNAME 是特殊环境变量,有的系统能改有的不能改...

可以 reproduce

我的:

$ U=a echo $U

返回空。

#7 楼 @linjunhalida 这里 U=a 只对后面起的那个进程内有用,而 $U 在 shell 的进程就已经替换掉了 ( cc #2 楼 @luikore )。U=a ruby -e "puts ENV['U']" 的话就是从 ruby 进程取的环境变量,所以会得到 a。对应的 shell 命令应该是

U=a bash -c 'echo $U'

跟 shell 的设置有关的。shell 在 exec 的时候会覆盖掉某些环境变量。在 zsh 下试下了 USERNAME 会被覆盖,在 bash 下不会覆盖。

$ bash -c 'USERNAME=a ruby -e "puts ENV[\"USERNAME\"]"'
a
$ zsh -c 'USERNAME=a ruby -e "puts ENV[\"USERNAME\"]"'
ian

@doitian 是啦,原来问题在这里!看来这个是zsh的 bug

#7 楼 @linjunhalida

U=a ; echo $U 
这样呢?

#10 楼 @wongyouth 确实,bash 没这个 bug 哈

需要 登录 后方可回复, 如果你还没有账号请 注册新账号