Alex_McAvoy

想要成为渔夫的猎手

Shell 的操作环境

【路径与命令的执行顺序】

在 Shell 中,一条命令的执行顺序为:

  1. 以相对/绝对路径执行命令,例如:/bin/ls
  2. alias 找到该命令执行
  3. 由 Shell 内置命令 builtin 来执行
  4. 通过 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 的系统命令目录
MAIL /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 配置文件名 命令可以直接使得修改后的配置文件生效,避免了繁琐的注销登录流程

感谢您对我的支持,让我继续努力分享有用的技术与知识点!