系统中的文件
在一般的 linux 或者 unix 系统中, 都可以通过编辑 bashrc 和 profile来设置用户的工作环境, 很多文章对于 profile 和 bashrc 也都有使用, 但究竟每个文件都有什么作用和该如何使用呢?
首先看系统中的文件,一般的系统可能会有
/etc/profile
/etc/bashrc
~/.bashrc
~/.profile
而如果系统是Ubuntu或者debian的话,就不会有/etc/bashrc而会有/etc/bash.bashrc文件。
以上这些就是常用 profile 和 bashrc 文件了. 要理解这些文件之前还需要了解 Shell, Shell 的 login(登入) 和 interactive(交互式) 模式。
Shell的分类
系统的 shell 有很多种, 比如 bash, sh, zsh 之类的, 如果要查看某一个用户使用的是什么 shell 可以通过 finger [USERNAME] 命令来查看. 我们这里只说 shell 是 bash 的情况, 因为如果是 sh 或者其他 shell 显然不会运行 bashrc 的。
1. login shell 和 no-login shell
“login shell” 代表用户登入, 比如使用 “su -“ 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式。
该模式下的 shell 会去自动执行 /etc/profile 和 ~/.profile 文件, 但不会执行任何的 bashrc 文件, 所以一般在/etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件。
而no-login shell得情况是我们在**终端下直接输入bash或者bash -c "CMD" **来启动的shell。该模式下是不会去自动运行任何的profile文件。
2. interactive shell 和 non-interactiveshell
interactive shell 是交互式shell, 顾名思义就是用来和用户交互的, 提供了命令提示符可以输入命令.
该模式下会存在一个叫 PS1 的环境变量, 如果还不是 login shell 的则会去 source /etc/bash.bashrc 和 ~/.bashrc 文件
non-interactive shell 则一般是通过 bash -c “CMD” 来执行的bash.
该模式下不会执行任何的 rc 文件, 不过还存在一种特殊情况这个我之后详细讲述
3. 在可能存在的模式组合中RC文件的执行
SSH login, sudo su - [USER] 或者mac下开启终端
ssh 登入和 su - 是典型的 interactive login shell, 所以会有 PS1 变量, 并且会执行
/etc/profile
~/.profile
4. 在命令提示符状态下输入bash或者ubuntu默认设置下打开终端
这样开启的是 interactive no-login shell, 所以会有 PS1 变量, 只会执行
/etc/bash.bashrc
~/.bashrc
通过 bash -c “CMD” 或者 bash BASHFILE 命令执行的 shell
这些命令什么都不会执行, 也就是设置 PS1 变量, 不执行任何 RC 文件
最特殊! 通过 “ssh server CMD” 执行的命令 或 通过程序执行远程的命令
这是最特殊的一种模式, 理论上应该既是 非交互 也是 非登入的, 但是实际上他不会设置 PS1, 但是还会执行
/etc/bash.bashrc
bashrc
这里还有一点值得注意的是/etc/bashrc任何情况下都不会执行。
bashrc和profile的区别
看了之前那么多种状态组合, 最关键的问题是, 究竟 bashrc 和 profile 有什么区别呢?
1. profile
其实看名字就能了解大概了, profile 是某个用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile.
2. bashrc
bashrc 也是看名字就知道, 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已.
期望的执行顺序
=> 代表 在文件内部 source, 换行的 => 代表自身执行结束以后在 source, 同一行表示先 source 在执行自身
1. 普通Login shell
/etc/profile
=> /etc/bash.bashrc
~/.profile
=> ~/.bashrc => /etc/bashrc
2. 终端中直接运行bash
/etc/bash.bashrc
~/.bashrc => /etc/bashrc
bash -c “CMD”
什么都不执行
ssh server “CMD”
/etc/bash.bashrc => /etc/profile
~/.bashrc => | /etc/bashrc => /etc/profile
| ~/.profile
这里会有点小混乱, 因为既有 /etc/bash.bashrc 又有 /etc/bashrc, 其实是这样的: ubuntu 和 debian 有 /etc/bash.bashrc 文件但是没有 /etc/bashrc, 其他的系统基本都是只有 /etc/bashrc 没有 /etc/bash.bashrc.
Shell 生效过程

参考链接
/etc/bashrc和/etc/profile傻傻分不清楚?
关于Linux环境变量的问题,~/.bashrc的环境变量为什么交互式登录shell方式依然会生效? - 伍亦勤的回答 - 知乎
https://www.zhihu.com/question/67348151/answer/851156600
网友评论