Mac 环境变量配置文件的执行

2,946 阅读4分钟

使用 Mac,见到过数种环境变量配置方法。
每次人家配置在哪,我就配置在哪,其实不清楚有什么区别,和深层原理,今天决定记录下。

shell

shell 这单词意思是「壳」。
在计算机领域理解为操作系统的一层壳,用于人机交互。本质是命令解释器

计算机分三层,从上往下是【应用程序】、【操作系统】、【硬件】。
shell 是个【应用程序】,它处于【应用程序】这一层的底部,非常靠近【操作系统】。

用户要直接与操作系统进行交互时。
通过【应用程序】terminal 向 shell 提交一条指令。
shell 把这条指令解析后,交给【操作系统】。
【操作系统】依据指令访问硬件资源,并把结果返回给 shell。
shell 把结果解析后,显示在 terminal 中。

中间的媒介就是 shell 。
总结:shell 是 人与操作系统直接交互的接口

查看系统自带哪些shell

cat /etc/shells

bash 和 zsh

zsh、bash 都是 shell 的一种实现。

bash 是各 Linux 发行版默认配置的 shell。
保持了对 sh shell 的兼容性。

zsh 比 bash 更加强大,功能也更加完善。
之前 Mac 默认是bash,从 macOS Catalina(10.15) 开始,默认终端 shell 从 bash 变为 zsh
在以前,很多人的 mac 中就使用 zsh 而不是 bash,一大半是因为 oh-my-zsh 这个配置集。它兼容 bash,还有自动补全等好用的功能。

bash 的环境变量是 ~/.bashrc
zsh 的环境变量是 ~/.zshrc

查看当前使用的是什么 shell 。

echo $0echo $SHELL

bash 与 zsh 切换

// 切换成 bash
chsh -s /bin/bash   

// 切换为 zsh
chsh -s /bin/zsh  

// 输入密码,成功切换,重启终端即可。

从 bash 切换至 zsh 了,但想复用 bash 所设置的环境变量,不希望再重新设置一遍配置。
可以在 .zshrc 文件的末尾添加

source  ~/.bash_profile

login-shell、 no-login-shell

login-shell:
进入 shell 操作,需要完整登录流程,要输入账号密码(比如tty和ssh登录)。
用户通过终端、SSH 或其他方式登录到系统。
清空环境变量,初始化环境变量,当前用户的 home 目录要变更。

non-login-shell:
不需要输入 用户名、密码 就能进入shell。
最常见的场景是「通过 su 切换用户」。

区别在于:login-shell 和 no-login-shell 加载的环境变量不一样。

一个简单的判断方法。

echo $0
# 输出的第一个字符是【-】,就是 login-shell。否则就是 no-login-shell。
# terminal 一打开,就是 login-shell。

配置文件

在 /etc/ 目录下的配置都是全局配置。 修改时需要root权限。
在 ~/ 目录下的,都是只对当前用户生效的个人配置。
带 profile、login 的都是 login-shell 配置文件。 profile 一词的含义就和【用户档案】有关。

/etc/profile
不建议修改此文件\color{red}{不建议修改此文件}
若要进行个性化设置,在用户级的配置文件中做配置。

/etc/paths
在系统启动时,这些路径会被添加到全局的 $PATH 环境变量的前面,影响所有用户和进程。

全局建议修改此文件\color{limeGreen}{全局建议修改此文件}
编辑 paths,将环境变量添加到 paths 文件中 ,一行一个路径
文件内不用 export 那种方式添加环境变量,文件里的每一行的路径就会被添加到环境变量中。
提示:输入环境变量时,不用一个一个地输入,只要拖动文件夹到 Terminal 里就可以了。

/etc/profile.d/*.sh
目录下所有【.sh文件】都会自动加载。

希望某些配置对所有用户都生效,那就要修改全局的 /etc/profile 。
改坏了怎么办?或者 /etc/profile 越来越大,越来越复杂。
所以,别轻易变动 /etc/profile。
而是,自己创建个【.sh文件】,把配置写里面,放在 /etc/profile.d/ 目录下。
帮 /etc/profile 解耦的。

/etc/bashrc
一般在这个文件中添加系统级环境变量
全局配置,不管是「login-shell」还是「no-login-shell」,都会读取此文件。

配置文件加载顺序

### 由上到下的先后

# login-shell  
/etc/profile
/etc/profile.d/*.sh      # mac 似乎是 /etc/paths.d/ 文件夹所有内容 
~/.bash_profile
    #  ~/.bash_profile 
    #  ~/.bash_login
    #  ~/.profile
    #
    # 这几个文件,只读取一个。按从上到下的顺序读取。读取到任何一个,后面的便不再读取。
~/.bashrc
/etc/bashrc



# no-login-shell
~/.bashrc
/etc/bashrc
/etc/profile.d/*.sh

问题:有了 ~/.bash_profile 文件,就不加载 ~/.bashrc 文件。
解决方案:要加载 ~/.bashrc文件,需要在 ~/.bash_profile 文件中直接加载该文件。

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

# 上述是针对终端 bash 的。
# 若是 zsh ,需在 ~/.zlogin 文件 加入上述代码

设置 PATH

# 语法,中间用冒号隔开
export PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>

# 举例
export PATH=/opt/local/bin:/opt/local/sbin:$PATH

立即生效

环境变量被更改,重启后也会生效。
如果希望立即生效,在 terminal 执行

source  <filename>

附录

rc = 「Run Commands」