#[喵咪Linux(2)]环境变量的坑#
##前言##
玩过linux的童鞋对环境变量都不陌生,我们在安装好一些软件,组件之后想要直接使用它都需要加入环境变量,并且比如java啊golang都必须依赖你设置的环境变量来运行,在最近笔者在日常工作中遇到了一些关于环境变量的坎,所以今天把这些"坑"分享出来和大家交流!
附上:
喵了个咪的博客:w-blog.cn
##1. 两场景##
笔者有个习惯就是喜欢追问场景,比如别人问我一个问题,token要怎么用sign要怎么玩,我都会先问你是什么场景,什么场景才使用什么技术,简单或复杂,所以这样不例外我们先来了解一下,笔者遇到的两个场景分表是什么
###1.1 场景一###
笔者在使用supervison的时候需要使用root权限才能去执行一些命令,使用了发布工具没法直接得到root的权限,肯定也不能直接开发所有用户可以登录到root(风险很大),所以打算用ssh通过来获取root的权限执行命令,这个时候我使用了如下命令:
ssh root@localhost "supervisorctl restart xxxxx"
但是这个时候意外的返回了找不到命令bash: supervisorctl: command not found,我通过ssh连接上去是可以执行的是没有问题的
###1.2 场景二###
第二个场景是在使用go的时候遇到的,我也是需要发布go程序,然后使用部署的这个用户去build程序然后执行,这个时候居然提示了go命名不存在,这个时候很纳闷,按照约定是在/etc/profile里面配置好了应该配置的目录了啊,在root下面也是没有任何问题.
抱着怀疑的心态我把服务器reboot了一下,神奇的事情发生了root的go命名也没法使用了
##2. 出了什么问题?##
看是上面这两个场景,都是跨用户去执行命令的时候出现了找不到命令,只有一个东西可以解释这个问题,就是环境变量.
后面我试着通过env来查看环境变量,我的发布用户的环境变量比root少了一截,那我们就开始定位问题把,这个时候就不得不说Linux的环境变量的几种形式了
**/etc/profile:**此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行并从/etc/profile.d目录的配置文件中搜集shell的设置.
**/etc/bashrc:**为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取
**~/.bash_profile:**每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
**~/.bashrc:**该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该
###2.1 场景一###
了解这上面这四种Linux获取环境变量的机制就不难解释场景一的问题了,大家可以看到除了/etc/bashrc除外的里面都有一个前提条件,当用户登陆时,如果你先登录到ssh是肯定没有问题的触发了登录操作,环境变量都会加载进来,但是如果是使用ssh root@localhost "xxxx" 后面带命令的形式的时候这个时候是不会触发login的只是单纯的执行一下命令就释放了,这个时候唯一能加载的环境变量就是/etc/bashrc所以需要去/etc/bashrc进行一下配置就ok了
###2.2 场景二###
场景二的问题就比较奇怪了,我的go环境变量是配置到/etc/profile中的理论上来说是不会出现我在这类问题的,之所以在reboot之前root可以使用是因为在配置好环境变量之后执行了source /etc/profile,解决方法还是和场景一的一样把环境变量移到/etc/bashrc中,在/etc/bashrc中的环境变量基本可以保证会加载进来
##3. 总结##
在很多时候教程啊等等指导的环境变量配置往往是在/etc/profile中,所以也就会有这一些奇奇怪怪的问题,大家以后配置环境变量可以通过你的不同的影响范围配置到不同地方可以实现不同的影响范围,大家get到了吗!
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!
来源:oschina
链接:https://my.oschina.net/u/2394822/blog/676697