shell登录、非登录,交互、非交互 概念详解

登录、非登录模式

登录模式表示需要输入用户名密码登录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`

猜你喜欢

转载自blog.csdn.net/u013259665/article/details/128856874
今日推荐