欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux编程 9 (shell类型,shell父子关系,子shell用法)

程序员文章站 2023-01-23 12:05:35
一. shell类型 1.1 交互式 bin/ shell程序 当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行。系统启动什么样的shell程序取决于你个人的用户ID配置,在etc/passwd文件中。如下图所示,root用户使用bash shell作为 ......

一. shell类型

  1.1  交互式 bin/ shell程序

    当用户登录到某个虚拟控制台终端或是在gui中启动终端仿真器时,默认的shell程序就会开始运行。系统启动什么样的shell程序取决于你个人的用户id配置,在etc/passwd文件中。如下图所示,root用户使用bash shell作为自己的默认shell程序。
      Linux编程 9 (shell类型,shell父子关系,子shell用法)
    bash shell程序位于/bin目录下,使用长列表可以看出它是一个可执行程序:
      Linux编程 9 (shell类型,shell父子关系,子shell用法)
    像/bin/tcsh 或/bin/dash 或/bin/csh 这些都是shell程序。在我centos 7中没有找到,由于bash shell 使用者最多,很少有人使用其它shell作为默认shell。

  1.2  系统 bin/sh程序

    除了bash/shell程序还有另外一个默认的shell是/bin/sh。它作为默认的系统shell,用于那些需要在启动时使用的系统shell脚本。在centos 系统中可以看到,使用软链接将默认的系统shell设置成bash shell。这样说来,sh其实就是bash程序。
      Linux编程 9 (shell类型,shell父子关系,子shell用法)
    但注意的是有些发行版系统上,默认的系统shell和默认的交互shell并不相同。例如在ubuntu发行版中。最后并不是必须一直使用默认的交互shell,可以使用发行版中所有可用的shell。可以直接输入命令/bin/dash来启动dash shell。具体就不在演示。


二. shell的父子关系 

   2.1 创建子shell 

    上面说的默认bash shell, 是一个父shell。之前所有章节中所用的交互式shell 都是用的父shell。要创建一个子shell程序很简单,输入bash就会创建一个新的shell程序,被称为子shell。要区分是父shell还是子shell,需要使用前面所学的ps 查看进程命令。
    在root用户下,先看没有子shell的父shell进程,如下图所示:
      Linux编程 9 (shell类型,shell父子关系,子shell用法)
    接下来,输入bash,来创建一个子shell, 该子shell的ppid父进程是1748, 对应-bash进程的(pid) 1748。
      Linux编程 9 (shell类型,shell父子关系,子shell用法)

  2.2 子shell创建shell

    上面创建的子shell进程为4136。子shell也可以创建一个子shell,子shell再创建子shell。它们的关系如下图所示:
      
          Linux编程 9 (shell类型,shell父子关系,子shell用法)

    下面来演示下这个关系图的shell创建和它们之前的关系层次。下图中又创建了二个子shell,总共三个子shell。依次是子shell, 孙shell, 曾孙shell。
      Linux编程 9 (shell类型,shell父子关系,子shell用法)

    下图使用ps -f命令也能够通过ppid列出谁是谁的父进程。
      Linux编程 9 (shell类型,shell父子关系,子shell用法)

    注意:生成子shell的成本不低,而且速度还慢,创建嵌套的子shell去处理命令进程性能更为严重。

  2.3 退出子shell

    通过输入exit命令能有条不絮的退出子shell,例如上面的三个子shell, 首先从曾孙shell退出, 如下图所示:
      Linux编程 9 (shell类型,shell父子关系,子shell用法)

    当没有了子shell时,再输入exit将退出控制台终端。

 

三. 其它子shell的用法     

  3.1 进程列表子shell

    在shell中,将命令放入括号中,并在命令列表尾部加分号(;)。这样便会创建出一个子线程去执行。是否生成了子shell,需要借助echo $bash_subshell,如果该命令返回0,表示没有子shell。 如下图所示:一组命令放入括号中,产生了一个子shell去执行的。
      Linux编程 9 (shell类型,shell父子关系,子shell用法)

    上面说了用命令列表放入括号中,就会创建一个子shell,下面在括号中再套一个括号, 结果是在子shell上创建了子shell。
      Linux编程 9 (shell类型,shell父子关系,子shell用法)

    在shell脚本中,经常会使用子shell进行多进程处理。但采用子shell明显拖慢处理速度。因为它并非真正的多进程处理,因为终端控制着子shell的i/o。

 

  3.2 后台模式子shell

    在交互式shell中,一个高效的子shell用法就是使用后台模式,在后台模式中运行命令在处理命令的同时让出cli,以供他用。 演示后台模式经典命令就是sleep。想要将命令置入后台模式。在命令末尾加上字符&。 结合sleep暂停10秒,通过ps命令来看看。
    如下图所示,将sleep命令置入后台模式,在shell cli提示符([root@hsr ~]#)返回之前,出现了后台作业号1,以及后台作业进程1317。通过ps可以看到,该后台命令进程1317一直在运行。
      Linux编程 9 (shell类型,shell父子关系,子shell用法)

    通过jobs命令可以查看当前后台模式的进程信息(另外jobs -l 显示进程号),如下图所示:
      Linux编程 9 (shell类型,shell父子关系,子shell用法)
    一但10秒过后,后台进程完成,再输入命令jobs,可以看到该命令进程已完成,如下图所示:
      Linux编程 9 (shell类型,shell父子关系,子shell用法)
  
  3.3 后台模式 进程列表子shell

    在3.1中讲到了进程列表子shell, 进程列表是运行在子shell中的一条或多条命令。下面将进程列表置入后台模式,如下所示:当一级子shell的数字1显示在提示符的旁边时,按下回车键。
    Linux编程 9 (shell类型,shell父子关系,子shell用法)

     在使用shell时,很多情况下,可以将命令置入后台模式,例如在前面章节讲到的tar归档,下面演示创建备份文件,有效利用后台模式,下面将mysql的慢日志归档。
    Linux编程 9 (shell类型,shell父子关系,子shell用法)
    Linux编程 9 (shell类型,shell父子关系,子shell用法)

    将子shell要处理的进程置入后台模式,即可以在子shell中进行繁重的处理工作,又不会让子shell的i/o受制于终端。