交互式SHELL和非交互式SHELL、登录SHELL和非登录SHELL的区别

赞赏 2017-07-14

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


交互式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 。 比如下面的命令行演示:

# 在 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命令来验证其真实性。

参考资料:man bash (搜索interactive、login等关键)

登陆后阅读全文
阅读 1676 赞赏 0 有用 2 没用 1 收藏 0 分享

   



0 条留言

王一甲的头像

王一甲

记录分享linux操作小技巧

相关文章

Linux 登入Shell与非登入Shell有什么区别?

好用的 Fish shell 入门教程

云服务器 ECS linux 如何更改系统默认 Shell

电脑无线连接安卓手机 进入android命令行模式(完胜adb shell数据线连接方式)

谁敢在我电脑上放这个脚本,我杀了他

Linux下窗口管理器 xmonad 的使用教程

bash 执行 shell 脚本提示 ll: command not found

我是如何执行 "rm -rf ~" 的

Linux下如何设置和查看系统环境变量

安全组设置允许SSH登录到 Linux 实例

有料推荐

这世界欠我一个这样的老公!

高校学生模仿“世界名画”摆拍,可以说是戏精本精了

iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评

果然是高手!这次在日本,特朗普竹杠敲得不是一般狠

资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样

长一样的双胞胎也能识别?蚂蚁金服发布「眼纹识别」技术

苏联是怎么被阿富汗拖垮的?

美团或入局「分时租赁」共享汽车,王兴要大笔投入「泛出行」领域了? | 36氪独家

你或许被“一盘番茄炒蛋”刷屏了,但有人辛酸,有人质疑

iPhone X发售前夜,黄牛与苹果公司的不安

他的文章

Linux screen 提示:There is no screen to be resumed matching

写代码怎能不会这些Linux命令?(linux常用命令)

翻译 | 最实用的 Linux 命令行使用技巧

Linux下如何设置和查看系统环境变量

Linux 终端里的记录神器 - script命令

bash 执行 shell 脚本提示 ll: command not found

linux ll 或 ls -l 后,文件的owner和group全是数字,为啥?

linux下grep过滤的时候如何排除某些字符以及排除多个?

Linux下的sort如何按数字按某列排序?(包含sort常用选项)

Charles手机抓包操作流程(iOS的http/https请求)

手机扫一扫
分享文章