如何理解 Linux 中的 登录shell 和 非登录shell,两者又有什么区别
登录 SHELL: 就是使用 用户名/密码 登录系统的时候,此时会自动启动一个 shell 交互式命令行,这个就是登录shell。
| 场景 | 是否登录 shell | 原因 |
|---|---|---|
| ssh user@host | 是 | sshd 启动 login shell 给你 |
| 控制台输入用户名密码登录 | 是 | 标准的 login shell |
| su - username | 是 | - 表示 login 模式 |
| bash -l | 是 | -l = login 模式 |
例如:使用ssh客户端工具 xshell 远程连接到服务器,此时会启动一个shell终端,这就是登录shell。

非登录 SHELL:就是已经进入系统了,然后又重新开了一个新shell环境,这就是非登录shell。
| 场景 | 是否非登录 shell | 原因 |
|---|---|---|
在已登录环境中执行 bash |
是 | 开了一个子 shell |
| 图形界面点击 Terminal(Ubuntu 桌面等) | 是 | 默认不会走 login shell |
| 脚本执行:bash xxx.sh | 是 | 脚本运行不会创建 login shell |
例如:我在操作系统图形化界面上,点击 Terminal 图标,启动的就是一个非登录的shell。

例如:我已经使用 xshell 等ssh客户端工具连接到服务器了,然后我再 执行 bash 命令系统的shell,这就是一个非登录shell。

如何区分登录SHELL 和 非登录shell:
在当前终端上执行 echo $0,如果是 - 开头,说明登录 shell,如果没有就说明是非登录shell。

登录shell 和 非登录shell 的区别:
-
登录 shell:会加载加载全局配置和用户级配置。如:
/etc/profile、~/.profile等。 -
非登录 shell:只会读取
~/.bashrc,其他的配置不再重新加载,而是继承父 shell 的变量
