使用 Mac,见到过数种环境变量配置方法,每次也都是按照别人的代码。
人家配置在哪,我就配置在哪,其实不清楚有什么区别,和深层原理,今天决定记录下。
shell
shell 这单词意思是「壳」。
在计算机领域理解为操作系统的一层壳,用于人机交互。本质是命令解释器。
在 Linux操作系统、类Unix操作系统 中,用户要直接与操作系统进行交互时。
首先用户输入命令,接着操作系统理解命令,然后操作系统返回执行结果。
中间的媒介就是 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 的环境变量是 ~/.bash_profile
zsh 的环境变量是 ~/.zshrc
查看当前使用的是什么 shell 。
echo $0
或
echo $SHELL
bash 与 zsh 切换
// 切换成 bash
chsh -s /bin/bash
// 切换为 zsh
chsh -s /bin/zsh
// 输入密码,成功切换,重启终端即可。
从 bash 切换成 zsh 了,但是想复用 bash 所设置的环境变量,不希望所有的配置要重新再设置一遍。
可以在 .zshrc 文件的末尾添加
source ~/.bash_profile
重启终端,即可使用 bash 的环境变量了。
login shell、 no-login shell
login shell: 在用户登录系统时启动的交互式 shell。 需要完整登录流程,要输入账号密码(比如tty和ssh登录)。 用户通过终端、SSH 或其他方式登录到系统。
non-login shell:不需要再次登录(比如图形界面打开 terminal 或 shell里再执行bash命令之类的)。
在已经登录系统的情况下启动的交互式 shell。当用户在登录后打开新的终端窗口或者运行一个 shell 脚本时,会启动一个非登录 shell。非登录 shell 不会读取用户的登录配置文件(所以,修改 ~/.bash_login 后需要 source xx 才能生效),而是读取 /.bashrc或/.zshrc等。这些文件通常包含设置别名、定义函数、配置 shell 提示符等。
核心理解:看什么情况是需要 计算机初始化整体环境与配置。
什么算「用户登录」,什么算「已经登录」?
在使用 Windows 时不会这种困惑,因为 Windows 是典型的单用户操作系统,同时只允许一个用户登录。
但在使用 macOS 后,会比较困惑,到底什么算用户登录?
在开机后的图形化界面输入密码后按回车?
还是每打开一个终端?困惑的原因也是每次打开终端,都会有类似 login 的字眼。
通过几个例子来明确「用户登录」的概念,。
1.通过命令行登录一个无图形化界面的 Linux操作系统.
登录 shell,没什么疑问.
2.通过 SSH 远程连接云服务器.
登录 shell。
通过 SSH 远程登录服务器时,你是个刚进来的新用户啊。肯定要给你初始化环境和配置。
3.先通过 SSH 远程连接一次云服务器,同时连接第二次:
每个 SSH 连接都是独立的登录。
即使你在同一用户下打开多个 SSH 连接,它们也都是独立的登录 shell。
4.通过用户登录界面登录图形化界面 Linux 系统
登录 shell。本质上与1相同。
5.使用 su 命令切换用户
非登录 shell。不会执行目标用户的登录配置文件。
6.执行 shell 脚本。
非登录 shell。
开机后,登录账号进入桌面,然后打开新 【terminal 终端窗口】启动的是一个【非登录shell】。
Mac系统的环境变量,加载顺序为:【这里仅就常见的几种方式做顺序展示,中间过程可能会有一些遗漏】
bash:/etc/profile -> /etc/paths -> /etc/paths.d/ 文件夹所有内容 -> ~/.bash_profile -> ~/.bash_login -> ~/.profile -> ~/.bashrc
zsh:/etc/profile -> /etc/paths -> /etc/paths.d/ 文件夹所有内容 -> ~/.zprofile -> ~/.zshrc
注意:在shell里使用su - user_name 切换用户,登录的shell也是login shell。
login shell会按顺序读取的配置文件:
- /etc/profile
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
no login shell 在打开的时候,执行的文件是:
~/.bashrc
而又会执行 /etc/bashrc
配置文件
/etc/profile
- 加载时间:系统启动时加载,更新重启生效。
- 不建议修改。若要进行个性化设置,在用户级的配置文件中做配置。
/etc/paths
+ 在系统启动时,这些路径会被添加到全局的$PATH环境变量的前面,影响所有用户和进程。
+ 要配置全局环境变量,建议修改这个文件。
在 /etc 目录下的配置都是全局配置。
在 ~/ 用户目录下的,都是只对当前用户生效的个人配置。
带有 profile、login 的都是登录 shell 。 profile 一词的含义就是和【用户档案】有关的,所以是登录shell 。
当你打开一个终端时优先级顺序大致如下: ~/.bashrc(对于 Bash 命令行)或 ~/.zshrc(对于 Zsh 命令行)每次打开终端app时被读取,这是最先被读取的配置文件。当你打开一个新的终端窗口时,系统会首先读取 ~/.bashrc(对于 Bash 命令行)或 ~/.zshrc(对于 Zsh 命令行),仅对当前用户有效。
/etc/zshrc 或 /etc/bashrc每次打开终端app时被读取,系统级的配置文件,对于所有用户生效。
~/.zprofile 或 ~/.bash_profile只会在 第一次登录 Shell(电脑开机) 中被读取。如需手动加载,执行source ~/.zshrc或source ~/.bash_profile。
/etc/profile:只会在 第一次登录 Shell(电脑开机) 中被读取
Mac 的系统环境变量的执行顺序
- /etc/profile
- 加载时间:系统启动时加载,更新重启生效。
- 不建议修改。若要进行个性化设置,在用户级的配置文件中做配置。
- /etc/paths
- 在系统启动时,这些路径会被添加到全局的$PATH环境变量的前面,影响所有用户和进程。
- 要配置全局环境变量,建议修改这个文件。
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
- ~/.bashrc | ~/.zshrc
在 /etc 目录下的配置都属于全局配置,是系统级别的整体设置,系统启动就会加载。
~/ 目录下的,则属于用户级别的。
当然 mac 不是服务器,一般就自己用,不用分得太清楚。
/etc/profile
与 /etc/paths
是系统级别的,系统启动就会加载。
后面的 3~5 是当前用户级的环境变量,按照从上到下的顺序读取。读取到其中任何一个,其他的便不再读取。
如果~/.bash_profile
文件存在,则后面的几个文件就会被忽略,不读了.
如果~/.bash_profile
文件不存在,就依优先级去读取一下个存在的文件。
~/.bashrc
不在上述规则内,它是bash shell打开的时候载入的。
每次打开一个 Terminal ,~/.bashrc
文件都会被执行一次。
要配置用户级环境变量,建议在~/.bash_profile
中修改。
问:修改了 ~/.bashrc ,但每次打开 terminal 都不生效。 source ~/.bashrc 后会生效。
也就是说,在当前用户的目录下,如果有了 .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>
全局设置
下面的几个文件设置是全局的,修改时需要root权限
/etc/paths
编辑 paths,将环境变量添加到 paths 文件中 ,一行一个路径
文件里面不用 export 那种方式添加环境变量,直接它的文件内容里面的每一行的路径就会被添加到环境变量中。
提示:输入环境变量时,不用一个一个地输入,只要拖动文件夹到 Terminal 里就可以了。
/etc/profile
全局(公有)配置,不管是哪个用户,登录时都会读取该文件。
/etc/bashrc
一般在这个文件中添加系统级环境变量
全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件。
单个用户设置
~/.bash_profile 、~/.bash_login 、~/.profile
(任意一个文件中添加用户级环境变量)
注:Linux 里面是 .bashrc
而 Mac 是 .bash_profile
若bash shell是以login方式执行时,才会读取此文件。
该文件仅仅执行一次!
默认情况下,他设置一些环境变量
设置环境变量:
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
立即生效
环境变量被更改,重启后也会生效。
如果希望立即生效,在 terminal 执行
source <filename>
附录
rc = 「Run Commands」