shell进程

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/guiliguiwang/article/details/80605456

shell进程

1.1 shell的基本概念

    shell做为一种和Linux系统的特殊交互式工具,为用户提供了启动程序、管理文件系统中的文件及运行在Linux上的进程的途径。shell通过解析输入的文本命令,在内核中执行来达到与系统交互的功能。shell包含了一组内部命令,通过这些命令可以进行文件管理、程序管理及运行等操作。

     除了在文本命令界面上(or虚拟控制器终端or终端仿真器)通过命令行执行外,可以通过将多个shell命令放入文件中作为程序执行,这些文件就是shell脚本。在Linux系统中有许多不同类型的shell(如ash、tsch、zsh等),它们各自有不同的特性,可以根据需求自行选择。通常Linux发行版本的默认shell都是bash shell(由GNU项目开发的类Unix shell)。

1.2 shell进程

    通常我们在执行shell命令的时候直观的感觉就是命令是直接运行在Linux系统上的,其实这是个主观的误解,shell本身就是个程序是运行在Linux上的进程,shell命令的执行是在对应的进程内运行的(对应shell的内建命令和外部命令是不同的,下面再说)。

    当用户登入到虚拟终端or终端仿真器上时,就会启动默认的shell程序。用户登入启动什么样的shell取决于在/etc/passwd用户配置文件中列出的用户默认shell。


    Linux系统本身也有一个默认的shell就是/bin/sh,是用于在系统中启动系统shell脚本所指定的默认shell。通常在Linux系统中这个文件是一个符号链接文件,指向/bin/bash这个shell,也可以更改/bin/sh的链接来更换系统默认shell。

    

    用户登入终端所启动的shell是一个父shell。在终端的提示符后输入bash命令或其他等效bash命令时会创建一个新的shell程序,这个shell被称为子shell。如下,我们在终端中输入两次bash命令后使用ps --forest查看进程嵌套关系可以看出父shell和子shell的关系:


1.2 shell子进程的运用 

    在shell脚本中,经常会使用子shell进行多进程处理,但是多进程处理消耗的资源会高很多。其中进程列表、协程和管道都利用了子shell。

    进程列表是一种命令分组。将命令列表包含到括号中就形成了进程列表,每个括号都会生成一个子shell。我们可以通过获取BASH_SUBSHELL当前值来确定是否启动了子shell,启动了几个。如下进程列表例子输出:


    协程呢就是通过在后台生成一个子shell,并在子shell中执行命令,协程的运行结果不会输出在终端上。要使用协程处理使用coproc命令:


1.3 内建命令与外部命令

    shell命令有内建命令和非内建(外部)命令,它们之间操作大不相同。内建命令已经是和shell编译在一起了,作为shell工具的组成部分;外部命令是存在于shell之外的程序,外部命令通常位于/bin、/usr/bin、/sbin或/usr/sbin目录中,作为外部程序文件来运行,如ps就是外部命令,可是使用which和type查看到此命令是/bin/ps程序的命令。下列例子通过使用which或type查看内建命令cd和外部命令ps的区别:


    当外部命令执行时,会创建出一个子进程,这个子进程用来运行外部命令程序,这种操作被称为衍生。对于内建命令则直接在shell进程运行,不需要创建子进程进行运行命令。如ps作为外部命令,可以通过ps -f命令很方便的显示出对应的shell父进程和衍生出的ps子进程:


猜你喜欢

转载自blog.csdn.net/guiliguiwang/article/details/80605456