【路径与命令的执行顺序】
在 Shell 中,一条命令的执行顺序为:
- 以相对/绝对路径执行命令,例如:
/bin/ls - 由
alias找到该命令执行 - 由 Shell 内置命令
builtin来执行 - 通过 PATH 环境变量内路径的顺序找到的第一个命令来执行

【环境配置文件】
环境配置文件
在 Linux 系统中,存在一些环境配置文件,Shell 在启动时直接读取这些配置文件,以规划好 Shell 的操作环境
对于命令别名、自定义变量等,在注销 Shell 时就会失效,若想让他们永久生效,就需要将这些设置写入配置文件中
在通过 tty1~tty6 登录,需要输入用户名与密码进行验证,之后取得的 Shell 就被称为 login shell,也就是说在取得 Shell 时,需要完整登录流程的就是 login shell
而以 X Window 登录,再以 X 的图形界面启动终端机,此时的终端接口不需要输入用户名与密码,这样取得的 Shell 就被称为 non-login shell
对于 login shell 与 non-login shell 来说,两者读取的配置文件不一致
login shell
配置文件读取流程
login shell 只会读取以下两个配置文件:
/etc/profile:系统整体设置,不建议进行修改~/.bash_profile:用户个人设置,要想让命令别名、变量等永久生效,就需要写入该文件

/etc/profile
在 login shell 的 bash 环境中,该文件是每个用户登录取得 Shell 时一定会读取的配置文件,若想修改用户的整体环境,就对该文件进行修改,该文件中主要变量如下表:
| 变量 | 说明 |
|---|---|
| PATH | 依据 UID 决定是否包含 sbin 的系统命令目录 |
/var/spool/mail/账号名 |
|
| USER | 用户账号 |
| HOSTNAME | 主机的 hostname |
| HISTSIZE | 历史命令记录条数 |
除上述变量外,/etc/profile 文件还会调入下述数据:
/etc/inputrc:Shell 热键、[Tab] 有无声音等数据/etc/profile.d/*.sh:规定了现有 Shell 操作接口的颜色、语系、命令别名等/etc/sysconfig/i18n:决定 Shell 默认使用的语系配置文件
~/.bash_profile
Shell 在读完整体环境设置的 /etc/profile 并借此调用其他配置文件后,接下来会读取用户的个人配置文件
在 login shell 的 bash 环境中,所读取的用户个人配置文件其实主要是以下三个:
~/.bash_profile~/.bash_login~/.profile
实际上,login shell 只会读取上述三个文件中的一个,读取顺序是依照上述的顺序
也就是说,如果 ~/.bash_profile 存在的话,无论剩余两个文件是否存在,都不会读取,只有当 ~/.bash_profile 不存在时,才会读取 ~/.bash_login
之所以有这三个文件,是 bash 为了照顾从其他 Shell 环境转换过来的用户的习惯
打印 ~/.bash_profile 可以发现其分为两部分:
- 读取
~/.bashrc - 处理个人化设置

non-login shell
当取得 non-login shell 时,只会读取 ~/.bashrc 文件
打印 ~/.bashrc 可以发现其分为两部分:
- 用户个人设置
- 整体环境设置

需要注意的是,root 用户与一般用户的 ~/.bashrc 有所不同,但同样都是分为上述的两部分

source 命令
由于 /etc/profile 和 ~/.bash_profile 都是在取得 login shell 后才会读取的配置文件,因此如果将自己的偏好写入上述两个文件后,需要注销再登录后才会使得设置生效
使用 source 配置文件名 命令可以直接使得修改后的配置文件生效,避免了繁琐的注销登录流程
