区分交互式和非交互式shell、登录和非登录shell之间不同

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

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

交互式shell和非交互式shell(interactive shell and non-interactive shell)

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

shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。

可以通过打印“$-”变量的值(代表着当前shell的选项标志),查看其中的“i”选项(表示interactive shell)来区分交互式与非交互式shell。

master@jay-intel:~/workspace/shell$ echo $-
himBH
master@jay-intel:~/workspace/shell$ ./test.sh
echo $-
hB

登录shell和非登录shell

登录shell:是需要用户名、密码登录后才能进入的shell(或者通过”–login”选项生成的shell)。

非登录shell:当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令“bash”就是打开一个新的非登录shell,在Gnome或KDE中打开一个“终端”(terminal)窗口程序也是一个非登录shell。

执行exit命令,退出一个shell(登录或非登录shell);

执行logout命令,退出登录shell(不能退出非登录shell)。

master@jay-intel:~$ bash --login
master@jay-intel:~$ logout
master@jay-intel:~$ bash --login
master@jay-intel:~$ exit
logout
 
master@jay-intel:~$ bash
master@jay-intel:~$ logout
bash: logout: not login shell: use `exit'
master@jay-intel:~$ exit
exit

bash是 login shell 时,其进程名为”-bash“ 而不是”bash”。 比如下面的命令行演示:
man bash: A login shell is one whose first character of argument zero is a -, or one started with the –login option.

# 在 login shell 中:
[perf@host_220-188 ~]$ echo $0
-bash
[perf@host_220-188 ~]$ ps -ef | grep '-bash' | grep -v grep
root     16823 16821  0 May06 pts/0    00:00:00 -bash
perf     21135 21134  0 May07 pts/1    00:00:00 -bash
 
#在一个非登陆shell中:
jay@jay-linux:~$ echo $0
/bin/bash
jay@jay-linux:~$ ps -ef | grep '-bash' | grep -v grep
jay@jay-linux:~$

总结一下曾经看在chinaunix论坛中看到的关于登录shell与非登录shell、交互式shell与非交互式shell的讨论:

Login Shell:当init3时,mingetty spawn出登录提示符的时候,你输入帐号和密码进入了,出现了shell提示符,这个过程就是登录shell;
Interactive Shell:接下来你得到了一个像“root@host />”这样的提示符,你输入什么,它就解释出什么,这就是交互式shell;你在当前shell又fork了一个 shell(bash),这个bash也是交互式shell。通常情况下interactive shell是login shell派生出来的。

Non Interactive Shell:你需要写一个bash script,用外部shell执行“bash script.sh”命令,它(bash)从可以第一条命令执行到最后一条然后退出,不与你进行任何交互,它就是非交互式shell。

交互式非登录shell,例如你在Gnome图形界面中打开“终端”出来的那种窗口程序,和登录shell相比,它是“非登录”的,你并不需要输入用户名和密码,和非交互式shell相比,这是“交互式”的,就像你说的那它“你输入什么,它就解释什么”。

对于Bash来说,登录shell(包括交互式登录shell和使用“–login”选项的非交互shell),它会首先读取和执行/etc/profile全局配置文件中的命令,然后依次查找~/.bash_profile、~/.bash_login 和 ~/.profile这三个配置文件,读取和执行这三个中的第一个存在且可读的文件中命令。除非被“–noprofile”选项禁止了。

在非登录shell里,只读取 ~/.bashrc (和 /etc/bash.bashrc、/etc/bashrc )文件,不同的发行版里面可能有所不同,如RHEL6.3中非登录shell仅执行了“~/.bashrc”文件(没有执行/etc/bashrc),而KUbuntu10.04中却依次执行了/etc/bash.bashrc 和 ~/.bashrc 文件。

对于这些规则,可以直接在相应的配置文件中加一些echo命令来验证其真实性。

时间: 2024-10-25 20:05:49

区分交互式和非交互式shell、登录和非登录shell之间不同的相关文章

Linux下非交互式sshpass登录

摘要 在命令行 非交互的SSH登录的时候,一般我们可以借助于生成用户的公钥私钥对,然后把公钥添加到远程主机的authorized_keys文件,可以实现非交互无密码登录. 其实这里也可以有另外一种方式实现,即用sshpass命令. 这种情况比较适合Mac下用iterm2 SSH登录到远程主机的时候,长时间不操作导致 packet_write_wait: Connection to 192.168.xxx.xxx port 22: Broken pipe问题的解决办法 安装sshpass #!/u

Linux下交互式与非交互式修改用户密码的例子_linux shell

最近管理的一批机器,有个需求是要统一修改一个帐号的用户名密码,比如将qa帐号的密码改为1234,后来还为了脚本化,很方便的执行,还使用了非交互式地修改用户的密码.简单记录一下吧. 1. 交互式配置本地用户的密码:passwd 命令 复制代码 代码如下: [root@host_221-81 ~]# passwd qa Changing password for user qa. New password: BAD PASSWORD: it is too short BAD PASSWORD: is

两种Linux下非交互式命令的实现

一.概述 在Linux环境,有多种实现自动化的脚本语言,如Shell.Python.Perl.Tcl等.Shell语言因与Shell外壳结合紧密,是最常见的实现自动化的脚本语言. 同时,在Linux环境中存在大量功能单一的小工具--通常它们在指定输入后,立即就可获得输出,例如echo.cat等字符串/文本打印工具,又或者是如sed.awk等最常用的字符串编辑工具.通过编写Shell脚本,我们可以反复利用这些小工具来实现一些自动化的批处理. 在少数情况下,我们也需要用到一些交互式的工具,例如pas

浅析mysql交互式连接&非交互式连接_Mysql

交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议. 非交互式操作:就是你在你的项目中进行程序调用.比如一边是tomcat web服务器,一边是数据库服务器,两者怎么通信?在java web里,我们通常会选择hibernate或者是jdbc来连接.那么这时候就是非交互式操作.  在之前,我基本上不关系这两个属性,都是用的是mysql服务商推荐的默认值,就是8小时. 但是,从昨天开始,由于在新网租用了一个空间,而他

Linux下非交互式远程执行命令脚本

  Linux下非交互式远程执行命令脚本(比ssh更好的方式) openssh在每台机器上都有,ssh与scp经常出现在我们的生活中. 然而当要管理的机器规模越来越大时,ssh登陆到目标机器进行管理就变得不现实了. 虽然可以直接在ssh后面接命令的方式,进行命令的执行. 但是ssh的严格的权限认证使得我们不得不输入密码,或是建立信任关系,很难去自定义一个特定的认证方式. 基于ssh的这种不足.于是笔者就写了一个jetfire,这个工具.比ssh多的一个重要的功能就是可以自定义认证方式,顺便避免了

fdisk分区命令详解与fdisk非交互式分区

1.说明:fdisk如何来学习     fdisk,就是在linux中用来分区的一个命令了,至于详细的参数,可以man一下,这里给出实际应用过程中最常用的用法,因为这样比起单纯讲命令的语法功能更能掌握一个命令的实际用法.     下面的过程是在我自己的实验环境中搭建,先把简要的过程看一下: (1)添加一块1GB的磁盘 (2)fdisk详细分区过程 (3)通知Linux内核分区信息的更改 (4)格式化分区 (5)挂载分区     OK!我相信这样一个过程下来,你是真正可以做到添加一块硬盘,并自己做

Linux 交互式和非交互式两种修改用户密码方法实例

最近管理的一批机器,有个需求是要统一修改一个帐号的用户名密码,比如将qa帐号的密码改为1234,后来还为了脚本化,很方便的执行,还使用了非交互式地修改用户的密码.简单记录一下吧. 1. 交互式配置本地用户的密码:passwd 命令  代码如下 复制代码 [root@host_221-81 ~]# passwd qa Changing password for user qa. New password: BAD PASSWORD: it is too short BAD PASSWORD: is

sinntp 1.4发布 非交互式的NNTP客户端

sinntp 1.4该版本"mode reader"命令现在需要发送验证.已经可以使用非标准的端口号. sinntp 是一个很精简的非交互式的NNTP客户端. NNTP即网络新闻传输协议(Network News Transport Protocol)的英文字母缩写,是一个主要用于阅读和张贴新闻文章(新闻组邮件)到Usenet上的Internet的应用协议.这个协议也负责新闻在服务器间的传送.NNTP协议是由加州大学圣迭戈分校的Brian Kantor和加州大学伯克利分校的http:/

git多账号登录问题解析_linux shell

同一服务器,同一托管平台,多个账号问题 1.添加key 我们暂且以oschina为例.为了更好的说明问题,我们在oschina平台分别用账号111新建项目test111和账号222新建项目test222,记得项目私有化哦,不然我们也没啥说的了. 在我们想要把项目test111 clone下来之前,需要先按照下面的步骤设置关联的key ssh-keygen -t rsa -C "111@163.com" // 邮箱是账号111对应的邮箱 整个过程就回车完事,操作起来那是相当的简单!但是还