一、shell简述
shell是一个命令行解释器工具,它是一个时刻都在运行的程序,当我们在命令行输入命令,shell会去解释执行这个命令。 shell这个工具不止一种,我们使用Linux系统的时候,默认启动的shell 是/etc/passwd 这个字段里记录的shell,下面的是bash shell
- 上面两个图可以看出 bash shell程序位于/bin目录内。而我们去查看这个 /bin/bash文件,就可以可以看出/bin/bash(bash shell)是一个可执行程序:
二、shell的父子关系
- 1、用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,是一个父shell,我们刚登陆上Linux系统的CLI界面的时候就存在了,可以用ps -f 查看
- 2、如果继续在CLI提示符后输入/bin/bash 命令或其他等效的bash 命令时,会创建一个新的shell程序。这个shell程序被称为子shell (child shell)。子shell也拥有CLI提示符,同样会等待命令输入。
如上图可以看出,第一次什么都不做,使用ps -f 命令,就可以看到 有bash的进程,这个就是父shell, 然后我们再输入bash 命令,输入后,看不出任何变化,但实际上,已经又生成了一个子shell. 从图中可以看出,新生成的子shell的PID是537699,这个shell的父进程是 537377. 然后我们看父shell的PID就是 537377。
-
备注:进程就是正在运行的程序。bash shell是一个程序,当它运行的时候,就成为了一个进程。一个运行着的shell就是某种进程而已。因此,在说到运行一个bash shell的时候,你经常会看到“shell”和“进程”这两个词交换使用。
-
3、连续输入3个bash,我们由上面的信息可以得知,会生成了3个子进程,通过
ps --forest 这个命令,可以看出进程的父子关系。
三、在命令行中执行命令
- 1、我们可以在一行中指定要依次运行的一系列命令。所有的命令都会依次执行
-
2、也可以給这些命令加上一个括号,这样的话,系统会生成一个子进程,在子进程里去执行这些个命令。
-
3、要想知道是否生成了子shell,得借助一个使用了环境变量的命令。(环境变量会在第6章中详述。)这个命令就是echo $BASH_SUBSHELL 。如果该命令返回0 ,就表明没有子shell。如果返回1 或者其他更大的数字,就表明存在子shell, 可以看出,加上括号的命令,打印的变量值就是1.
四、shell的内建命令和非内建命令
-
1、在学习GNU bash shell期间,你可能听到过“内建命令”这个术语。搞明
白shell的内建命令和非内建(外部)命令非常重要。内建命令和非内
建命令的操作方式大不相同。 -
2、外部命令
- 外部命令,有时候也被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps 很方便显示出它的父进程以及自己所对应的衍生子进程。
-
3、内建命令
- 外部命令 和内建命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。
-
4、ps 就是一个外部命令。可以使用which 和type 命令找到它。ps 是 外部命令,cd 是内建命令。 分别对ps 和cd ,使用 which和type命令查询 ,可以看出区别。
- 总结:内建命令和外部命令在调用的时候。外部命令会创建出一个包含全新环境的子进程,而内建命令则不会,所以外部命令的使用成本更高。内建命令因为不需要创建新环境,所以更高效,不会受到环境变化的影响