登录、非登录模式
登录模式表示需要输入用户名密码登录shell
特例:
- `zsh -l`是登录模式,不需要输入用户名密码,表示用当前用户登录
- `ssh 用户名@ip script.sh`是非登录非交互式shell,需要输入用户名密码
非登录模式表示用户在新的shell中没有登录
当logout能成功执行,表示当前是在登录模式中
交互、非交互模式
交互、非交互模式的本质区别在于,一批任务在执行过程中,是否需要人机互动。
比如执行一批任务,需要手动一个一个敲入命令,这样就是交互模式
还有在命令执行过程中,需要人为为程序输入数据,这也是交互模式,不过如果提前准备好输入,例如:`order <input.txt`不需要人为输入数据,也就变成了非交互模式
那么将一批任务写为一个shell脚本,虽然过程中不需要人为再输入命令,但是可能程序执行过程中需要输入参数,所以执行shell脚本这即可能是交互模式,也可能是非交互模式。
网络上普遍说的:
交互式shell(交互式登录shell、交互式非登录shell)特指,打开了一个shell进入了一个新的命令行界面。
非交互式shell(非交互式登录shell、非交互式非登录shell)特指,打开了一个shell执行了一个shell脚本,过程中可能需要用户输入数据。 所以此种模式是有可能发生交互的。
shell有很多中,例如bash、csh、fish、zsh。本人常用的是zsh,所以具体示例中都是使用zsh的情况,不过各种shell大同小异,知道一种即可触类旁通。
各种类型的shell打开时自动执行脚本情况,执行顺序是从上到下:
登录交互式shell | 登录非交互式shell | 非登录交互式shell | 非登录非交互式shell | |
/etc/zsh/zshenv ~/.zshenv |
Y | Y | Y | Y |
/etc/zsh/zprofile ~/.zprofile |
Y | Y | ||
/etc/zsh/zshrc ~/.zshrc |
Y | Y | ||
/etc/zsh/zlogin ~/.zlogin |
Y | Y |
环境变量继承
`su - `相关的所有shell方式都无法继承父shell环境变量,`ssh 用户名@ip script.sh`无法继承父shell环境变量
交互式shell:
交互式shell指打开了一个shell进入了一个新的命令行界面
在最开始,一般情况下,用户要么通过ssh登录要么直接在本地登录,这种属于是登录式shell。随后,在命令行下执行`su - 用户名`、`zsh l`都是打开登录一个新的shell。
而执行 `su 用户名`、`zsh`都是打开一个新的shell,但是没有登录。其中在图形界面打开命令界面也是非登录模式。
环境变量继承:
非登录模式会继承父shell的环境变量,
而登录模式中`su - 用户名`新打开的shell和父shell没有继承关系,所以不可以继承环境变量,
但是`zsh l`可以继承父shell的环境变量。
shell类型 是否继承父环境变量 交互非登录式shell 是 `zsh l` 是 `su - 用户名` 否
非交互模式:
非交互式shell指打开了一个shell执行了一个shell脚本
第一种方式是`ssh 用户名@ip script.sh`远程执行shell脚本
第二中方式是在当前命令行界面,执行上图命令
环境变量继承:非登录式shell,一般情况下会继承父shell的环境变量。但有两个例外:
非登录非交互式shell `su - 用户名 -s script.sh`、`ssh 用户名@ip script.sh`不会继承父shell的环境变量
shell类型 是否继承父环境变量 `ssh 用户名@ip script.sh` 否 `su - 用户名 -s script.sh` 否 其他非登录非交互式 是 `zsh -l script.sh` 是 `su - 用户名 -s /bin/zsh script.sh` 否