一直使用的是前几年买的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. java错误与异常

    java异常处理机制 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常, 让程序尽最大可能恢复正常并继续执行,且保持代码的清晰.Java中的异常可以是函数中的语句执 ...

  2. panic 捕获及 throw 崩溃

    一,go 语言 panic 报错捕获  使用 go 语言的同学在真实项目中应该经常出现空指针使用等 panic 报错,这类报错与 C++ 中的 try-catch 模块不同,go 语言会一直将当前 p ...

  3. Linux安装sdkman

    项目使用java的开发者一定会为新配环境变量而头大,sdkman很好的解决了系统sdk管理的痛点,仅需简单的几行命令就可以完成sdk的安装,更改默认版本.再也不用担心环境变量的问题. 安装 既然是命令 ...

  4. 【计算机视觉】UCLA开源图像检测器

    UCLA (加州大学洛杉矶分校)发布了一个强大的图像检测软件的源码 ,该软件可以非常高速的检测每个图像的细节,例如可用于检测指纹和虹膜,或者用于自动驾驶.通过识别物体的边界进行提取.首先确定一个物体的 ...

  5. pycharm右键运行unittest、pytest文件

    在实际学习过程中,有时候会出现右键运行文件,但没有任何结果的情况.这就是没有使用unittest/pytest 的方式运行. 解决方法: 添加好

  6. QA 中的对抗攻击和防御

    攻击 supporting facts 的修改:字符调换,替换词(用空格embedding或近同义词,变形词等) 还有针对question的攻击. 梯度下降,在embediing上做攻击,如何deco ...

  7. mongo fork

    logpath=../log/mongodb.log logappend=false dbpath=/hejing/data/db fork=true

  8. 通过js判断整型,浮点型,布尔型,字符串型

    <!DOCTYPE html> <html > <head>     <meta charset="UTF-8">     < ...

  9. PTA (Advanced Level)1077.Kuchiguse

    The Japanese language is notorious for its sentence ending particles. Personal preference of such pa ...

  10. 小菜鸟之HTML第三课

    jquery的引入 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...