一直使用的是前几年买的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下终端内的环境变量问题的更多相关文章

  1. mac下查看和设置环境变量

    1.查看环境变量 命令    env 2.修改环境变量 命令    cd ~ && ls -a && sudo vim .bashrc 编辑输入要添加的环境变量 3.s ...

  2. Mac下IDE无法读取环境变量问题

    今天遇到一个问题,Idea无法读取~/.bash_profile下的配置文件. 上网查了好久,都说是launchctl的问题. 但是其实我这边是因为安装了zsh,导致环境标量失效. 在~/.zshrc ...

  3. Mac下搭建php开发环境教程

    方案一:原生安装 这篇文章主要介绍了Mac下搭建php开发环境教程,Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例,需要的朋友可以参考 ...

  4. mac 下搭建 Android 开发环境

    因工作需要,要在mac 下搭建 Android 开发环境.谷歌.度娘了好久,没有找个一个完整又系统的方法,很是苦恼.最终,皇天不负有心人,找到了下面这篇文档,结合亲身体验,特此记录.也为有这方面需求的 ...

  5. Mac下docker搭建lnmp环境 + redis + elasticsearch

    之前在windows下一直使用vagrant做开发, 团队里面也是各种开发环境,几个人也没有统一环境,各种上线都是人肉,偶尔还会有因为开发.测试.生产环境由于软件版本或者配置不一致产生的问题, 今年准 ...

  6. shell里的IFS内置环境变量

    IFS 的全称是 Interal Field Separator ,即“内部区域分隔符”,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space character),制表 ...

  7. Mac 下安装Phonegap开发环境

    Mac 下安装Phonegap开发环境 2014.09.11  星期四 评论 0 条    阅读 5,613 次 作者:野草 标签:phonegap ios mac 什么是Phonegap呢?Phon ...

  8. mac 下终端访问文件出现“Permission Denied”解决方案

    mac 下终端访问文件出现“Permission Denied”解决方案: 一个文件有3种权限,读.写.可执行,你这个文件没有可执行权限,需要加上可执行权限. 1. 终端下先 cd到该文件的目录下 2 ...

  9. windows下如何设置mysql环境变量

    方法一: windows下如何设置mysql环境变量 关键词: mysql, Setting Environment Variables, 环境变量设置 我的电脑->属性->高级-> ...

随机推荐

  1. Selenium 2自动化测试实战37(自动发邮件功能)

    自动发邮件功能 例如,如果想在自动化脚本运行完成之后,邮箱就可以收到最新的测试报告结果.SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到 ...

  2. 小D课堂 - 新版本微服务springcloud+Docker教程_5-05熔断降级服务异常报警通知

    笔记 5.熔断降级服务异常报警通知实战     简介:完善服务熔断处理,报警机制完善 1.加入redis依赖         <dependency>             <gr ...

  3. 经典MapReduce作业和Yarn上MapReduce作业运行机制

    一.经典MapReduce的作业运行机制 如下图是经典MapReduce作业的工作原理: 1.1 经典MapReduce作业的实体 经典MapReduce作业运行过程包含的实体: 客户端,提交MapR ...

  4. 关于注释【code templates】,如何导入本地注释文件

    关于如何在eclipse.myeclipse导入本地注释文件 [xxx.xml]   请看操作方式 下面是code templates文件的内容 注意  把文件中的 @@@@@@@@@@@@@@@  ...

  5. python3速查参考- python基础 4 -> 元组 + 字典 + 字符串 的学习

    元组 元组:特点就是内容不可变,算只读的列表,可以被查询,不能被修改 a = 2, print(a) print(type(a)) b = ('a','b','c') print(b[1]) 运行结果 ...

  6. Python3 Selenium自动化web测试 ==> 第五节 WebDriver高级应用 -- 使用JavaScript操作页面元素

    学习目的: 中级水平技术提升 在WebDriver脚本代码中执行JS代码,可以解决某些 .click()方法无法生效等问题 正式步骤: Python3代码如下 # -*- coding:utf-8 - ...

  7. C语言I—2019秋作业第一周作业

    1.你对软件工程专业或者计算机科学与技术专业了解是怎样? 软件工程专业是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科.它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设 ...

  8. superset采集流程

    superset采集流程: 先从业务的bi从库oride-slave-bi(10.52.123.212)去拿数,然后计算(每10分钟由airflow调py代码),放到bi的库(BI业务-数据指标存储1 ...

  9. pyton 类(4) 静态方法

    class Cat(): tag = ' 猫科动物 ' def __init__(self, name): self.name = name @staticmethod def breah(): pr ...

  10. T100——修改单身栏位,开窗,当前行

    PRIVATE FUNCTION axmt500_update_xmdc028() ###更改出货库位 DEFINE l_i INT DEFINE l_index INT DIALOG ATTRIBU ...