记录--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, 环境变量设置 我的电脑->属性->高级-> ...
随机推荐
- selenium 常见操作事件2
1.不打开浏览器驱动(加速) 注意:不启动浏览器器时,需要把浏览器驱动放置以下位置:①.python安装的根目录②.google的安装目录() from selenium import webdriv ...
- nodejs语言实现验证码生成功能
验证码已经是非常常用的反作弊.反攻击手段了,其实要实现这个功能对技术水平好的人也不难,但是并不是每个人,每种语言都天然适合搞某个功能...不过我们可以通过封装接口,来屏蔽差异化,把问题简单化,现在就用 ...
- 九十七:CMS系统之模板抽离和个人信息页面
模板抽取,将公共的页面抽出来作为模板 {% from 'common/_macros.html' import static %}<!DOCTYPE html><html lang= ...
- Ubuntu开放指定端口
一般情况下,ubuntu安装好的时候,iptables会被安装上,如果没有的话那就安装上吧 安装 在终端输入 sudo apt-get install iptables 添加规则 在终端输入 ipta ...
- chrome下常用插件
1.xdebug helper 配合PhpStorm使用调试PHP 2.json-handle 格式化JSON返回数据 3.website ip 查看当前网站IP 4.host switch plus ...
- Java泛型(7):无界通配符<?>
无界通配符<?>很容易和原生类型混淆. 以List为例: List表示持有任何Object类型的原生List,其实就等价于List<Object> List<?>表 ...
- URLSearchParams的注意事项(个人总结)
官网解释:URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串,一些方法的使用. 前天测试说 有些功能在ie实现不了,顺便把报错发我了:URLSearchParams ...
- iptables基本命令到深入
1.关闭firewalld,安装iptables-server并启动服务 systemctl stop firewalld systemctl disable firewalld yun -y ins ...
- 产品之我见(2)-求职APP
在求职过程中使用了BOSS直聘.拉钩.领英这三款软件,下面来讲述一下作为求职者身份的使用感受以及遇到的问题. 一.BOSS直聘 手机端:打开首先是标语“互联网招聘神器”的页面 ...
- Sequelize+MySQL存储emoji表情
一.原因 mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情.但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持em ...