1、交互式和非交互式shell:

交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
非交互式模式,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
可以通过打印“$-”变量的值(代表着当前shell的选项标志),查看其中的“i”选项(表示interactive shell)来区分交互式与非交互式shell。
区别:是否与用户进行交互(如:在终端执行命令,shell等待你的输入,并且立即执行你提交的命令。)

2、登录式和非登录式shell:

登录shell:是需要用户名、密码登录后才能进入的shell(或者通过”–login”选项生成的shell)。
非登录shell:当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令“bash”就是打开一个新的非登录shell。

3、登录与交互

是否登录与是否交互是两个维度的概念。两两组合的四种情况均会出现:

3.1、交互式登录

常见的登录系统后进行操作的shell。

3.2、非交互式登录

强制使用登陆方式执行的shell脚本。

3.3、交互式非登录

常见的shell脚本运行的方式。

3.4、非交互式非登录

在shell中使用bash调出shell,在系统中打开命令行工具。

4、shell配置文件

用户登录到 Linux系统后,系统将启动一个用户 shell。在这个 shell中,可以使用 shell命令或声明变量,也可以创建并运行 shell脚本程序。运行 shell脚本程序时,系统将创建一个子 shell。此时,系统中将有两个 shell,一个是登录时系统启动的 shell,另一 个是系统为运行脚本程序创建的 shell。当一个脚本程序运行完毕,它的脚本 shell将终止,可以返回到执行该脚本之前的 shell。从这种意义上来说,用户可以有许多 shell,每个shell都是由某个 shell(称为父shell)派生的。
在子 shell中定义的变量只在该子 shell内有效。如果在一个 shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内 的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他 shell中被改变,可以使用export命令对已定义的变量进行输出。 export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
同时,在我们使用 shell的同时,我们应该清楚shell的一些配置文件的存放位置,按照范围来分,可以分为两种:

1. 全局配置:

/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从 /etc/profile.d 目录的配置文件中收集 shell 的设置。如果你有对 /etc/profile 有修改的话必须得 source 一下你的修改才会生效,此修改对每个用户都生效。

/etc/profile.d/*.sh

/etc/bashrc
为每一个运行 bash shell 的用户执行此文件。当 bash shell 被打开时,该文件被读取。如果你想对所有的使用 bash 的用户修改某个配置并在以后打开的 bash 都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个 bash 即可生效。

2. 用户配置:

~/.bash_profile
每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次!默认情况下,它设置一些环境变量,执行用户的~/ .bashrc 文件。 此文件类似于 /etc/profile,也是需要需要 source 才会生效,/etc/profile 对所有用户生效,~/.bash_profile 只对当前用户生效。~/.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。

~/.bashrc
该文件包含专用于你的 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该文件被读取。(每个用户都有一个 ~/.bashrc 文件,在用户目录下) 此文件类似于 /etc/bashrc,不需要重启就可以生效,重新打开一个 bash 即可生效,/etc/bashrc 对所有用户新打开的 bash 都生效,但 ~/.bashrc 只对当前用户新打开的 bash 生效。
~/.bashrc文件会在bash shell调用另一个bash shell时读取,也就是在shell中再键入bash命令启动一个新shell时就会去读该文件。这样可有效分离登录和子shell所需的环境。但一般 来说都会在/.bash_profile里调用/.bashrc脚本以便统一配置用户环境。

5、交互式登录shell和非交互式登录shell的区别

交互式登录:(清除掉所有变量,通过文件重新读入)
1.直接通过终端输入账号密码登录
2.使用“su - username”切换的用户
执行顺序:(影响该shell的配置文件)
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile–> ~/.bashrc–> /etc/bashrc

非交互式登录:(会继承上一个shell的全部变量)
1.su UserName
2.图形界面下打开的终端
3.执行脚本 (当我们执行脚本的时候.我们就已经进入到了一个子shell)
4.任何其它的bash实例
执行顺序:(影响该shell的配置文件)
~/.bashrc–> /etc/bashrc–> /etc/profile.d/*.sh