文章目錄
  1. 1. 1. interactive-login shell 交互式登录shell
  2. 2. 2. non_interactive-login shell 非交互式登录shell
  3. 3. 3. interactive-non_login shell 交互式非登录shell
  4. 4. 4. non_interactive-non_login shell 非交互式非登录shell

bash也是一种shell,根据interactive和login进行划分,它有四种模式:

1. interactive-login shell 交互式登录shell

interactive即交互,用户可以输入命令与shell进行交互
login即登录,简单来说就是需要输入用户名密码(或者其他凭证)的登录方式
这种模式的例子:

  • 用户直接登录机器获得的第一个shell
  • ssh user@remot 获得的shell

这种模式下加载配置文件的顺序

  1. /etc/profile 加载系统配置
  2. ~/.bash_profile ~/.bash_login ~/.profile 按顺序查找这三个个人配置文件,如果执行成功其中一个则返回(三个中只会有一个被执行)

2. non_interactive-login shell 非交互式登录shell

这种模式不常见
一个例子:

bash -l script.sh
-l表示将shell作为一个登录shell启动

配置文件加载顺序同1

3. interactive-non_login shell 交互式非登录shell

在登录shell中再打开一个shell就属于这种模式,例子

  • shell命令行执行bash
    • 在图形化界面中打开terminal

这种模式下加载配置文件的顺序

  1. /etc/bash.bashrc
  2. ~/.bashrc

4. non_interactive-non_login shell 非交互式非登录shell

这种模式挺常见的,例子:

  • bash script.sh
  • ssh user@remote command

这种模式它会寻找变量BASH_ENV,将变量的值作为文件名进行查找,如果找到便加载它。

1
2
export BASH_ENV=~/.bashrc
bash script.sh

我们时常远程执行脚本或者使用非登录用户执行脚本时会遇到缺少环境变量的问题,其实就是因为我们使用的是非交互式非登录shell,这种模式下配置文件都没有加载,所以我们要在执行脚本命令之前先加载配置,即在脚本最上面添加

1
2
source /etc/profile
source ~/.bash_profile

文章目錄
  1. 1. 1. interactive-login shell 交互式登录shell
  2. 2. 2. non_interactive-login shell 非交互式登录shell
  3. 3. 3. interactive-non_login shell 交互式非登录shell
  4. 4. 4. non_interactive-non_login shell 非交互式非登录shell