利用普通帐户Liusu的身份下载了一个Tomcat包,进入bin目录,开始运行,./startup.sh启动正常。
然后su到root用户,因为我想root没有设置JAVA_HOME环境变量,所以./startup.sh应该是不能运行的,可是结果出乎我的意料,Tomcat正常启动了,以root用户运行了,不能相信,以root运行printenv,发现竟然存在JAVA_HOME变量。这就奇怪了去了。我猜想是不是root用户能够读取所有用户的环境变量设置,于是新加了一个用户tom,然后在给tom设置一个环境变量HELLO,重新回到root,运行$HELLO,得不的结果,说明我的猜想root用户会共享所有用户的环境变量是个错误的假设。
经过分析和检测,发现问题出在我登录root的方式上,我是通过一个liusu用户的终端并通过su来登录root用户的,这个过程环境变量的设置如下:
1:当打开这个终端的时候,是以liusu用户登录的,当前的这个BASH已经读取了所有给liusu用户设置的变量。比如JAVA_HOME等
2:当通过su登录root用户的时候,继续读取root用户的变量设置,如果存在同样的变量名称,则对root读取的变量会取代读取liusu变量时候的设置。比如新的root的PATH会取代旧的取得的PATH变量,如果root变量没有的,而liusu有的变量,则继续保持,如JAVA_HOME。(这就是为什么在root运行java命令的时候,出来的是gcj版本而在liusu运行java,出来的是正常java。因为我们为liusu用户设置的PATH包含了JAVA_HOME/bin,而root用户PATH没有设置)
3:也就是说,通过su登录的时候,当前的bash的环境变量会是root与原来用户(这里是liusu)的变量的交集。(继续作个实验,给liusu设置一个变量HELLO=“Helloliusu”,给root也设置HELLO="Helloroot",结果通过su登录root后读取HELLO变量的结果是Helloroot.)
另外,设置环境变量:
全局设置:
直接修改/etc/profile
针对用户修改:
修改~/.bashrc~/.bash_profie
系统是:Debian4.0。
迷惑的Linux环境变量迷惑的Linux环境变量迷惑的Linux环境变量迷惑的Linux环境变量迷惑的Linux环境变量迷惑的Linux环境变量迷惑的Linux环境变量迷惑的Linux环境变量迷惑的Linux环境变量迷惑的Linux环境变量
阅读(740) | 评论(0) | 转发(0) |