[喵咪Linux(2)]环境变量的坑

#[喵咪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到了吗!

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大壮

iOS GCD定时器

3243
来自专栏移动端周边技术扩展

github中存放预览网页

831
来自专栏向治洪

android studio编译慢的问题

1.修改android studio的使用堆内存,根据自己电脑的内存,尽量设置的大一点,点击help->如下图: ? ?    2.接下来设置使用离线gradl...

2358
来自专栏Java成神之路

Idea_学习_09_Idea 方法自动生成参数默认名

生成方法后,还空着参数,可以使用 ctrl + alt + 空格 ,列出参数,然后选择参数即可。

1174
来自专栏电光石火

EMLOG无插件实现网站源码压缩

在以往的Emlog优化教程中,相信都是使用的代码压缩插件,今天主要是分享插件的代码版本,也就是不使用插件,直接将代码丢在module.php中就可以,好吧,又消...

2695
来自专栏技术碎碎念

同步/异步,阻塞/非阻塞

什么是同步和异步 同步和异步是针对应用程序和内核的交互而言的, 同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO...

3586
来自专栏Ceph对象存储方案

如何创建自定义数据pool的RGW实例

本文适用于jewel以上版本(含) 本文用到的软件版本如下 ceph:version 10.2.7 OS: Linux 3.16.0-4-amd64 #1 SM...

3729
来自专栏黑泽君的专栏

如何把云端服务器上的file04.c文件传输到本地pc机windows系统上去呢?

一般服务器会放在机房,很多时候我们一般是通过一某个终端软件进行远程连接到服务器,然后再去工作。

2111
来自专栏西安-晁州

使用bee自动生成api文档

beego中的bee工具可以方便的自动生成api文档,基于数据库字段,自动生成golang版基于beego的crud代码,方法如下: 1、进入到gopath目录...

6221
来自专栏中国白客联盟

Android动态调试(三)Xposed hook

1292

扫码关注云+社区

领取腾讯云代金券