这里先介绍一个重要的概念:bash的运行模式。bash的运行模式分为login shell和non-login shell。
login shell和non-login shell两者有什么区别呢?
login shell:取得 bash 时需要完整的登陆流程的就称为 login shell。举例来说,我们通过 ctrl+alt+fn 登陆 tty1 ~ tty6 时,需要输入用户的账号与密码,此时取得的 bash 就称为“ login shell ”;
non-login shell:取得 bash 接口的方法不需要重复登陆的举动的就称为 non-login shell。举例来说,我们登陆 Linux 后, 右键启动的终端 Terminal或者在原本的 bash 环境下再次使用 bash 这个命令,建立的bash子进程,都称为 non-login shell。
为什么要介绍这两种bash的运行方式呢?
这是因为这两种shell启动时会加载不同的配置文件,login shell启动时会加载/etc/profile
,~/.bash_profile
,~/.bashrc
。non-login shell启动时会加载~/.bashrc
。
而在加载~/.bashrc
(实际是~/.bashrc中
加载的/etc/bashrc
)或/etc/profile
时,都会执行如下代码片段,它会去执行/etc/profile.d
目录下的所有.sh后缀的bash脚本。
login shell和non-login shell在启动时主要加载的配置文件如下图所示。
这里顺便提一下su和su -,su表示以non-login-shell的切换root用户;而su -则表示以login-shell切换root用户。大家感兴趣的可以分别以这两种方式切换用户并执行env指令查看一下环境变量,你会发现以su -方式切换的环境变量远远多于su方式。
所以,不管是login shell还是non-login shell,启动时都会加载/etc/profile.d/*.sh
中的环境变量。所以我们一般会在/etc/profile.d
中创建一个 my_env.sh 文件用于配置我们自己的环境变量。
在配置完环境变量后,我们可以选择重新启动一个 shell 以自动加载环境变量配置文件,也可以使用 soruce + my_env.sh 的方式加载环境变量配置文件。
为什么 soruce + my_env.sh 的方式能加载环境变量配置文件呢?
我们知道,bash脚本的执行方法分为三种:
- 输入bash/sh + 脚本的相对路径或绝对路径执行脚本
- 赋予脚本执行权限,直接输入脚本的绝对路径或相对路径执行脚本
- 在脚本的路径前加上 “.” 或者 source 的方式执行脚本
前两种都是在当前 shell 中打开一个子 shell 来执行脚本内容。而在脚本的路径前加上“.”或者 source的方式执行bash脚本,可以使脚本内容在当前 shell 里执行,而无需打开子 shell。开子 shell 与不开子 shell 的区别就在于环境变量的继承关系,例如在子 shell 中设置的变量,父 shell 是不可见的。