记录--mac下终端内的环境变量问题
一直使用的是前几年买的MacBook Air,当时感觉很轻薄,外观也非常的好看,也是一直用到现在,大概有三四年了,系统还是很流畅(实话,不是打广告......)。平时也是经常要使用mac的终端,说实话,自从用了mac的终端,基本上跟linux的命令一样得心应手,再使用windows下的cmd就感觉很别扭,上去就打ls,windows是dir,当然有些命令还是相同的,比如mkdir。
好了,其他的就不多说了,这次出现的问题主要是这一段时间使用mac的终端的时候,发现配置的环境变量总是莫名其妙失效,每次都要source一下,并且source了一下还不够,每次重新打开终端都要重新source,刚开始也是没有在意,因为原来一直没有这个问题,而且平时基本上电脑也是不关机的,不用的时候直接合上,所以也没有怎么在意。今天再次出现这个问题的时候就打算必须要解决掉,到底为什么?
先是上网百度了一下这个Terminal init时候加载配置文件的顺序:
mac 一般使用bash作为默认shell Mac系统的环境变量,加载顺序为:
/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
我的环境变量是配置到 ~/.bash_profile文件中的,刚开始搜索时都是一大堆的让修改 .zshrc 文件,刚开始的时候确实安装了这个,后来还是感觉没有bash原始界面看着习惯就卸载掉了,我还以为没有卸载干净的问题,找了半天的.zshrc文件也没有找到,那就先否定了是这个问题。那么既然确定了终端初始化时配置文件的加载顺序,就可以一步步定位问题,对于这几个配置文件,/etc下面的两个文件是系统级别的,系统启动的时候就会加载,后面几个是当前用户级别。后面3个按照从前往后的顺序读取,如果~/.bash_profile文件存在,则后面的几个文件就会被忽略不读了,如果~/.bash_profile文件不存在,才会以此类推读取后面的文件。~/.bashrc没有上述规则,它是bash shell打开的时候载入的。这里可以推荐一个大神的博客,对这些文件讲解的很详细,这里我就不再详细介绍:MAC 设置环境变量path的几种方法
根据上面的规则,看起来~/.bashrc是比较特殊的,是打开终端就会载入的,而我是把环境变量配置到.bash_profile文件中,那么这里我们可以先测试一下,首先打开一下.bashrc文件看一下里面有什么。输入命令:vi ~/.bashrc,发现里面是空的,然后可以在里面输入 echo ".bashrc运行了", 保存退出。退出终端后重新打开,发现并没有输出 ".bashrc运行了"这句话,这是不是跟上面的规则违背了呢? 于是我再次搜索,在另一个大佬的文章中找到了答案:
Mac OS X 环境变量设置【转】 – Helix的日志 – 网易博客
“OS X 和 Linux 都有 .bash_profile 和 .bashrc 这两个配置文件。
但是,在OS X里会遇到bashrc不生效的情况。
当shell是login shell,.bash_profile才会加载,而bashrc正好相反。
真正的区别是在linux下,当用户登录到一个图形界面,然后打开一个终端terminal,那些shell是non-login shell。
然而,在OS X登录的时候,并没有运行着一个shell,所以,在运行Terminal.app的时候,其实那是一个login shell。
你还是可以在bashrc下写一些配置,只要在bash_profile里source .bashrc就是了。
对于login shell,我也确实在终端的配置中找到了相关答案: 点击终端的"偏好设置"选项

在通用一栏中可以看到shell的打开方式 "默认登录Shell"。刚开始时我发现我选择的是"命令(完整的路径)",在这种方式下并不会先加载".bash_profile"文件,这是我后来改过后发现可以保证.bash_profile文件在打开时就加载。

选择Shell的打开方式为"默认登录Shell"后,测试一下,看看终端是否是打开载入。首先在.bash_profile文件中写入 echo ".bash_profile文件运行了" ,保存退出后关闭终端重新打开。

发现.bash_profile现在确实是在终端打开时就先读取了,而刚才的.bashrc文件是没有在打开时加载的,那么如果我的环境变量想配置到.bashrc文件中,我们可以在.bash_profile文件中写入"source ~/.bashrc",因为终端打开时优先加载.bash_profile,加载到"source ~/.bashrc"这一句时会去加载 .bashrc文件,这样就可以保证配置在 .bashrc文件中的环境变量可以被加载到,下面可以测试一下:
1 .bash_profile文件中写入 echo ".bash_profile文件运行了" 和 "source ~/.bashrc"

2 .bashrc文件写入 echo ".bashrc文件运行了"

关闭终端后重新打开:

可以清楚的看到,打开终端后先输出了".bash_profile文件运行了",然后输出".bashrc文件运行了",这表明终端载入文件的顺序是先载入.bash_profile文件,而在.bash_profile文件中又source了.bashrc文件,因此使得加载.bash_profile文件的时也加载了.bashrc文件,这样即使你的环境变量是配置在.bashrc中的也可以正确的运行。输入env可以查看你当前配置的环境变量等信息。
总结:这次解决问题也是查了很多博客和帖子,千篇一律的也是一大堆,当时我搜索的是“mac下为什么每次打开终端都必须要重新source .bash_profile”,搜到的全是说你安装了zsh,启动终端时会读取.zshrc配置文件,这个也许说的都是对的,但不符合我的情况也不是我想要的,那么这种情况就应该仔细的分析一下,换一种思路去解答这个问题,首先每一次打开终端都必须要手动source一下.bash_profile文件,说明终端启动时没有读取这个文件,那么我当时就搜一下,mac下终端启动时环境变量配置文件的加载顺序,再加上这个问题原来是没有出现的,说明原来是管用的,说明将环境变量配置到.bash_profile文件中是没有问题的,到此问题就缩小到,为什么终端启动时没有读取.bash_profile文件。这些是我当时发现问题和解决问题的思路,可能有些啰嗦,但是我只是想把我整个解决问题的过程和想法分享给其他人,也是总结一下,方便自己,方便他人。
记录--mac下终端内的环境变量问题的更多相关文章
- mac下查看和设置环境变量
1.查看环境变量 命令 env 2.修改环境变量 命令 cd ~ && ls -a && sudo vim .bashrc 编辑输入要添加的环境变量 3.s ...
- Mac下IDE无法读取环境变量问题
今天遇到一个问题,Idea无法读取~/.bash_profile下的配置文件. 上网查了好久,都说是launchctl的问题. 但是其实我这边是因为安装了zsh,导致环境标量失效. 在~/.zshrc ...
- Mac下搭建php开发环境教程
方案一:原生安装 这篇文章主要介绍了Mac下搭建php开发环境教程,Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例,需要的朋友可以参考 ...
- mac 下搭建 Android 开发环境
因工作需要,要在mac 下搭建 Android 开发环境.谷歌.度娘了好久,没有找个一个完整又系统的方法,很是苦恼.最终,皇天不负有心人,找到了下面这篇文档,结合亲身体验,特此记录.也为有这方面需求的 ...
- Mac下docker搭建lnmp环境 + redis + elasticsearch
之前在windows下一直使用vagrant做开发, 团队里面也是各种开发环境,几个人也没有统一环境,各种上线都是人肉,偶尔还会有因为开发.测试.生产环境由于软件版本或者配置不一致产生的问题, 今年准 ...
- shell里的IFS内置环境变量
IFS 的全称是 Interal Field Separator ,即“内部区域分隔符”,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space character),制表 ...
- Mac 下安装Phonegap开发环境
Mac 下安装Phonegap开发环境 2014.09.11 星期四 评论 0 条 阅读 5,613 次 作者:野草 标签:phonegap ios mac 什么是Phonegap呢?Phon ...
- mac 下终端访问文件出现“Permission Denied”解决方案
mac 下终端访问文件出现“Permission Denied”解决方案: 一个文件有3种权限,读.写.可执行,你这个文件没有可执行权限,需要加上可执行权限. 1. 终端下先 cd到该文件的目录下 2 ...
- windows下如何设置mysql环境变量
方法一: windows下如何设置mysql环境变量 关键词: mysql, Setting Environment Variables, 环境变量设置 我的电脑->属性->高级-> ...
随机推荐
- java基础内存基础详解
堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对 ...
- 一百零四:CMS系统之修改邮箱界面
在base.css中加一个全局的css控制宽度 .form-container{ width: 300px;} 视图 class ResetEmailView(views.MethodView): d ...
- 九十五:CMS系统之cms后台模板渲染
定义一个宏,用于渲染static文件的时候,只需要传文件名就可以,上下两个“-”是解决渲染的时候源代码换行的情况 {% macro static(filename) -%} {{ url_for('s ...
- springmvc集成swagger
1.保证项目为maven项目 2.导入jar包依赖 <dependency> <groupId>io.springfox</groupId> <artifac ...
- R语言与概率统计(二) 假设检验
> ####################5.2 > X<-c(159, 280, 101, 212, 224, 379, 179, 264, + 222, 362, 168, 2 ...
- CentOS8 安装 simple-scan 的方法
CentOS8删除了很多软件包,解决的思路一般是从CentOS7或EPEL7的软件仓库中寻找,并解决依赖关系. 比如找到EPEL7中有 simple-scan 软件包,但安装时发现其又依赖 gnome ...
- lumen返回网站base url
可以使用全局帮助函数url() echo url(); //输出http://test.domain.com
- Java中的字节,字符与编码,解码
ASCII编码 ASCII码主要是为了表示英文字符而设计的,ASCII码一共规定了128个字符的编码(0x00-0x7F),只占用了一个字节的后面7位,最前面的1位统一规定为0. ISO-8859-1 ...
- 【JVM学习笔记】线程上下文类加载器
有许多地方能够看到线程上下文类加载的设置,比如在sun.misc.Launcher类的构造方法中,能够看到如下代码 先写一个例子建立感性认识 public class Test { public st ...
- .Netcore 2.0 Ocelot Api网关教程(4)- 服务发现
本文介绍Ocelot中的服务发现(Service Discovery),Ocelot允许指定一个服务发现提供器,之后将从中寻找下游服务的host和port来进行请求路由.关于服务发现的详细介绍请点击. ...