您的位置:首页 > 运维架构 > Shell

交互式shell和非交互式shell、登录…

2014-11-25 18:11 134 查看
也算写过一些Bash脚本的人了,不过对与这几个概念,还不是很清楚,于是恶补了一下。

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

首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录。

交互式shell和非交互式shell

交互式模式就是shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。

shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行。

在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

chinaunix 论坛中关于登录shell与非登录shell、交互式shell与非交互式Shell的讨论:

Login Shell:当init3时,mingetty
spawn出登录提示符的时候,你输入帐号和密码进入了,出现了shell提示符,这个过程就是登录外壳;

Interactive Shell:接下来你得到了一个像root@host
/>这样的提示符,你输入什么,它就解释出什么,这就是交互式外壳;

你在当前Shell又fork了一个shell(bash),这个bash也是交互式外壳。通常情况下interactive
shell是login shell派生出来的。

Non Interactive Shell:你可能需要学习写一个bash
script,用外部shell执行:bash script.sh,

它(bash)从第一条命令执行到最后一条然后退出,不与你进行任何交互,它就是非交互式外壳。

交互式非登录shell就是指你在Gnome图形界面中打开“终端”出来的那种窗口程序,

和登录shell 相比,它是“非登录”的,你并不需要输入用户名和密码,

和非交互式shell相比,这是“交互式”的,就像你说的那它:你输入什么,它就解释出什么

执行exit退出非登录shell状态;

执行logout退出登录shell状态。

在登录shell里,确实只读取/etc/profile和~ /.bash_profile, ~/.bash_login, and
~/.profile按顺序最先的一个,并执行其中的命令。除非被 --noprofile选项禁止了;

在非登录shell里,确实只读取 /etc/bash.bashrc和~/.bashrc

转自:http://www.51testing.com/html/38/225738-216858.html

==========================================

以下来自另一文

==========================================

 当启动shell时,它将运行启动文件来初始化自己。具体运行哪个文件取决于该shell是登陆shell还是非登陆shell的交互方式(比如通过bash),又或者是一个非交互式shell(用来执行shell脚本)。要执行启动文件中的命令,用户就必须具备读的权限,而一般的Linux发行版本都会把对应的命令放在一些启动文件中。

1:交互式登陆shell

交互式登陆shell指的是当用户登录系统时所用的那个shell(可以默认指定,如bash shell)。登录shell
将查找几个不同的启动文件来处理其中的命令,

bash shell 处理文件的顺序如下:

/etc/profile

shell首先执行/etc/profile中的命令。设置这个文件后,可以为系统内所有的bash用户建立默认的特征(不同版本的Linux在此文件放置的命令不尽相同);

~/.bash_profile、~/.bash_login、~/.profile
然后shell依次查找这些文件,并执行它找到的第一个文件中的命令。可以将命令放在这些文件中,以重写/etc/profile文件中默认的设置;

~/.bash_logout

当用户注销时,bash执行文件~/.bash_logout中的命令,这个文件包含了退出会话时执行的清理命令,如:删除临时文件等;

2:交互式非登陆shell

交互式非登陆shell指的是如果启动了一个bash shell 而没有登陆系统(如在CLI
提示符中键入bash),则启动了一个交互式非登录shell。

交互式非登录shell并不执行前面提到的启动文件中的命令,然而交互式非登陆shell从登录shell继承了由这些启动文件设置的shell变量。

/etc/bashrc

尽管不是通过bash直接调用,但许多~/.bashrc文件调用/etc/bashrc。这种设置使得超级用户可以为系统内的非登陆shell建立默认属性。

.bashrc
交互式非登陆shell执行~/.bashrc文件中的命令,而登陆shell的启动文件(如.bash_profile)通常会运行这个文件。这样,登陆shell和非登陆shell都可以运行.bashrc中的命令了。

3:非交互式shell

非交互式shell指的是以shell script(脚本)方式运行。

在这种模式在运行时shell
并不与用户进行交互(除非在运行时需要用户指定运行参数),而是读取存放在文件中的命令并执行它们。

当它读到文件的结尾,shell 也就终止了。

这些shell从登陆时就继承了由这些启动文件设置的shell变量。

BASH_ENV

非交互式shell查找环境变量BASH_ENV(或者当作为sh调用时为的ENV),并执行由该变量命名的文件中的命令。

转自:http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580744.html

==========================================

以下来自另一文

==========================================

神马是shell

Shell是一种具备特殊功能的程序,它是介于使用者和 UNIX/Linux
操作系统之核心程序(kernel)间的一个接口。

为什么我们说 shell 是一种介于系统核心程序与使用者间的中介者呢?

读过操作系统概论的读者们都知道操作系统是一个系统资源的管理者与分配者,当您有需求时,您得向系统提出;从操作系统的角度来看,它也必须防止使用者因为错误的操作而造成系统的伤害。

众所周知,对计算机下命令得透过命令(command)或是程序(program);程序有编译器(compiler)将程序转为二进制代码,可是命令呢?

其实shell 也是一支程序,它由输入设备读取命令,再将其转为计算机可以了解的机械码,然后执行它。

各种操作系统都有它自己的 shell,以 DOS 为例,它的 shell 就是 command.com 。如同 DOS 下有
NDOS,4DOS,DRDOS 等不同的命令解译程序可以取代标准的 command.com ,UNIX 下除了 Bourne
shell(/bin/sh) 外还有 C shell(/bin/csh)、Korn shell(/bin/ksh)、Bourne
again shell(/bin/bash)、Tenex C shell(tcsh) … 等其它的 shell。

UNIX/Linux 将 shell
独立于核心程序之外,使得它就如同一般的应用程序,可以在不影响操作系统本身的情况下进行修改、更新版本或是添加新的功能。

交互式与非交互式shell /登录shell与非登录shell

登陆shell与交互式非登陆shell的区别

1.登录shell

所谓登录shell,指的是当用户登录系统时所取的那个shell。登录shell属于交互式shell。

登录shell将查找4个不同的启动文件来处理其中的命令。 bash shell处理文件的顺序如下:

1: /etc/profile

2:/etc/profile.d等待配置文件

3: $HOME/.bash_profile

4: $HOME/.bash_login

5 $HOME/.profile

etc /profile是bash shell在系统上的主默认启动文件,系统上每一个用户在登陆时都将执行此文件。

通过设置这个文件,超级用户可以为全系统内的所有bash用户建立默认特征。不同 Linux版本在此文件放置的命令不尽相同,

在redflag中,该文件设置了几个重要的变量,

如:PATH USER LOGNAME MAIL HOSTNAME HISTSIZE
INPUTRC,详情可以查看具体的文件。

其余3个文件具备相同的功能——提供特定于用户的启动文件。大多数Linux版本只使用其中之一。

如:RedFlag使用.bash_profile
ubuntu使用.profile .

shell依次查找~/.bash_profile、

~/.bash_login、

~/.profile(~是用户主目录的速记符),

并执行它找到的首个文件中的命令。

可以将命令放置在这些文件中以覆盖掉/etc/profile文件中的默认设置。

也就是后面的文件可以覆盖或者修改前面的设置 。

2. 交互式非登录shell

如果启动了一个bash shell而没有等录系统(如在CLI提示符中键入bash),

则启动了一个交互式非登录shell.

而登录shell的初始化文件(比如.bash_profile)通常会运行这个文件。这样,登录shell和非登录shell都可以使用.bashrc中的命令。

如以X Window环境登录Linux时,在X环境所起动的终端,那些shell都是非登录shell.

在交互式非登录shell中并不执行前面提到的初始化文件中的命令。然而,交互式非登录shell从登录shell继承了由这些初始化文件设置的
shell变量。

(1) $HOME/.bashrc

交互式非登录shell执行~/.bashrc文件中的命令.在每次执行shell脚本时,都会重新读取这个文件,所以是最完整的。

但是万事都不是一样的,debain系列的是不同的,如ubuntu

/etc/profile-->/etc/environment-->$HOME/.profile

要配置java等变量时,都/etc/environment中

关于各个文件的作用域,在网上找到了以下说明:

(1)/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置。

(2)/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash
shell被打开时,该文件被读取。

(3)~/.bash_profile:
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

(4)~/.bashrc: 该文件包含专用于你的bash
shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

(5)~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系。

(6)

~/.bash_profile 是交互式、login 方式进入 bash 运行的

~/.bashrc 是交互式 non-login 方式进入 bash 运行的

通常二者设置大致相同,所以通常前者会调用后者。

Shell脚本和Shell的初始化
http://hi.baidu.com/С??ireed/blog/item/f45b3a137b6172d8f6039e62.html
Shell脚本用source或者.来获得。

例:

假设文件ls.script在文件夹linux下,这个文件夹下还有个文件是example,

[ireed@redhat linux]$ ls

example ls.script

下面是ls.script的内容:

[ireed@redhat linux]$ cat ls.script

ls

对,也就是说ls.script的内容就一行是ls。

开始实验:

[ireed@redhat linux]$ source ls.script

example ls.script

[ireed@redhat linux]$ ls

example ls.script

[ireed@redhat linux]$ . ls.script

example ls.script

[ireed@redhat linux]$

我们看到获得ls.script与运行ls命令会得到同样的效果,都是显示linux文件夹下面的内容,如果你编辑其他的脚本文件,然后获得它,也是可以运行的。

登录Shell、非登录Shell、交互式Shell与非交互式Shell

登录Shell
交互式Shell

从虚拟控制台登录Shell



通过网络Shell到一台

远程机器上时登录Shell



X初始化Shell



X终端Shell



手动执行bash启动的子Shell



用在命令替换中的子Shell



被小括号分组的命令使用的子Shell



执行脚本时使用的子Shell



也就是说左边有"login:"的就是登录Shell否则就是非登录Shell;交互与非交互Shell也是很好区分的.

启动登录Shell时获得/etc/profile,/etc/profile.d/*.sh及~/.bash_profile;

每次Shell启动时获得/etc/bashrc和~/.bashrc;

每次Shell退出时获得~/.bash_logout

只有登录Shell可以获得/etc/profile和~/.bash_profile;而/etc/bashrc和~/.bashrc被所有Shell获得.前两个文件用来配置环境变量,只被初始化一次,后两个习惯上用于Shell的自定义,如别名和Shell选项.

注意对称,对于环境变量,有一个通用的启动文件(/etc/profile)和一个本地的启动文件(~/.bash_profile),前者可以被系统管理员用来配置系统范围,后者被个人用户自定义自己的环境;/etc/bashrc和~/.bashrc也类似.

转自:http://blog.sina.com.cn/s/blog_896b31c70100xto3.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐