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

SEO研究中心 SEO研究中心提供免费SEO公开课

shell有两种模式:交互式shell和非交互式shell;shell还分登录ahell和非登录shell,是不是感觉有点晕?那么本文就来讨论一下交互式shell和非交互式shell、登录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.

  1. master@jay-intel:~/workspace/shell$echo$-
  2. himBH
  3. master@jay-intel:~/workspace/shell$./test.sh
  4. echo$-
  5. hB

登录shell和非登录shell

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

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

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

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

  1. master@jay-intel:~$bash--login
  2. master@jay-intel:~$logout
  3. master@jay-intel:~$bash--login
  4. master@jay-intel:~$exit
  5. logout
  6. --phpfensi.com
  7. master@jay-intel:~$bash
  8. master@jay-intel:~$logout
  9. bash:logout:notloginshell:use`exit'
  10. master@jay-intel:~$exit
  11. exit

bash是 login shell 时,其进程名为”-bash“ 而不是”bash”,比如下面的命令行演示:

  1. manbash:Aloginshellisonewhosefirstcharacterofargumentzeroisa-,oronestartedwiththe–loginoption.
  2. #在loginshell中:
  3. [perf@host_220-188~]$echo$0
  4. -bash
  5. [perf@host_220-188~]$ps-ef|grep'-bash'|grep-vgrep
  6. root16823168210May06pts/000:00:00-bash
  7. perf21135211340May07pts/100:00:00-bash
  8. #在一个非登陆shell中:
  9. jay@jay-linux:~$echo$0
  10. /bin/bash
  11. jay@jay-linux:~$ps-ef|grep'-bash'|grep-vgrep
  12. 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命令来验证其真实性.

相关广告
  • 区分交互式和非交互式shell、登录和非登录shell之间不同 区分交互式和非交互式shell、登录和非登录shell之间不同 区分交互式和非交互式shell、登录和非登录shell之间不同
相关阅读

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

2019/10/10 17:46:45 | 谷歌SEO算法 | SEO工具