1、定义和示例
登录 shell 和非登录 shell 是 Unix/Linux 系统中两种不同类型的 shell 会话。它们的主要区别在于它们的启动方式以及环境变量的设置方式。
1.1 登录shell
定义: 登录 shell 是当用户登录到 Unix/Linux 系统时启动的 shell。这通常发生在用户使用命令行界面(CLI)访问系统时,或通过 SSH 登录远程系统。
特征:
-
登录 shell 会读取特定的配置文件,以设置用户环境和变量。
-
通常会读取以下文件(根据使用的 shell 不同):
- Bash shell:
/etc/profile
(系统范围的配置)~/.bash_profile
~/.bash_login
~/.profile
- Zsh shell:
/etc/zsh/zprofile
~/.zprofile
~/.zlogin
- Bash shell:
-
在用户登录时,登录 shell 会执行这些文件中的命令和设置环境变量。
1.2 非登录shell
定义: 非登录 shell 是在用户已经登录后,打开的新 shell 会话。它通常用于交互式命令行操作,如 Terminal 中打开的新标签页或新窗口。
特征:
- 非登录 shell 通常不会读取登录 shell 需要的配置文件,而是读取另一组配置文件。
- 例如,Bash shell 会读取以下文件:
~/.bashrc
- 非登录 shell 通常用于终端中的命令行操作。
1.3 总结
特性 | 登录 Shell | 非登录 Shell |
---|---|---|
启动方式 | 用户登录系统时 | 已登录用户打开新终端时 |
读取配置 | /etc/profile , ~/.bash_profile | /etc/bashrc , ~/.bashrc |
通常用例 | 远程 SSH 登录,控制台登录 | 终端中新窗口/标签的 shell |
2、判断方法
输入以下命令:
echo $0
如果输出结果为 -bash
(对于 Bash),则表示这是一个登录Shell。若结果为 bash
(没有前面的连字符),则是非登录Shell。
3、相关配置文件关系
3.1 文件介绍
-
/etc/profile:
- 适用于所有用户,是系统范围的配置文件。
- 用于设置环境变量和启动其他配置。
-
/etc/bashrc:
- 也是系统范围的,但专门针对交互式非登录Shell。
- 定义了Shell的行为,以及一些功能和提示符设置。
-
~/.profile:
- 用户级别的登录Shell配置文件。
- 加载用户的环境变量和启动程序。比较通用,适用于sh和bash等多种Shell。
-
~/.bashrc:
- 用户级别的交互式非登录Shell配置文件。
- 主要用于设置Shell的功能,比如别名、函数等。
-
~/.bash_profile:
- 仅在bash的登录Shell中使用的文件。
- 通常用来调用
~/.bashrc
,并设置用户环境。
3.2 调用顺序
- 对于登录 shell,首先会加载
/etc/profile
,然后是用户级别的配置文件(如~/.bash_profile
或~/.profile
),最后可能调用~/.bashrc
(通常在~/.bash_profile
中调用)。 - 对于非登录 shell,通常只直接加载
~/.bashrc
。有些系统在读取~/.bashrc
之前会读取/etc/bashrc
。
4、测试
4.1 shell类型测试
4.2 配置文件执行顺序测试
/etc/profile中本身就会默认调用/etc/bash.bashrc,此处的/etc/bash.bashrc和/etc/bashrc相对应,只是名称略有区别在最后面我们追加一行内容:
同样在/etc/bash.bashrc中最后追加一行内容:
在root家目录下修改.proflle文件,其默认会调用家目录下的.bashrc,在最后面追加一行内容:
在~/.bashrc中追加一行内容:
重新登录ssh到终端,查看/home/filetest内容:
由于我们每个文件追加的打印内容在文件最后,但是profile中调用bashrc位于脚本的中间位置,所以出现上述顺序,实际上登录型shell调用顺序是/etc/profile--->/etc/bash.bashrc--->~/.profile--->~/.bashrc。
执行bash命令启用一个非登录shell,再查看文件,发现新增了两行,即非登录shell只会调用etc/bash.bashrc--->~/.bashrc
5、总结
本文讲解了登录Shell和非登录Shell一般定义,说明了/etc/profile、etc/bashrc、~/.profile、~/.bashrc、~/.bash_profile等文件的作用和调用关系。
根据上述测试测试,针对系统级的一些环境设置等操作建议在/etc/bashrc中修改,针对用户级的建议在~/bash.bashrc中修改,因为无论登录shell还是非登录shell都会调用这两个文件。