一. shell类型

  1.1  交互式 bin/ shell程序

    当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行。系统启动什么样的shell程序取决于你个人的用户ID配置,在etc/passwd文件中。如下图所示,root用户使用bash shell作为自己的默认shell程序。
      
    bash shell程序位于/bin目录下,使用长列表可以看出它是一个可执行程序:
      
    像/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程序。
      
    但注意的是有些发行版系统上,默认的系统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进程,如下图所示:
      
    接下来,输入bash,来创建一个子shell, 该子shell的PPID父进程是1748, 对应-bash进程的(PID) 1748。
      

  2.2 子shell创建shell

    上面创建的子shell进程为4136。子shell也可以创建一个子shell,子shell再创建子shell。它们的关系如下图所示:
      
          

    下面来演示下这个关系图的shell创建和它们之前的关系层次。下图中又创建了二个子shell,总共三个子shell。依次是子shell, 孙shell, 曾孙shell。
      

    下图使用ps -f命令也能够通过PPID列出谁是谁的父进程。
      

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

  2.3 退出子shell

    通过输入exit命令能有条不絮的退出子shell,例如上面的三个子shell, 首先从曾孙shell退出, 如下图所示:
      

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

三. 其它子shell的用法     

  3.1 进程列表子shell

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

    上面说了用命令列表放入括号中,就会创建一个子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一直在运行。
      

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

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

    在使用shell时,很多情况下,可以将命令置入后台模式,例如在前面章节讲到的tar归档,下面演示创建备份文件,有效利用后台模式,下面将mysql的慢日志归档。
    
    

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

Linux编程 9 (shell类型,shell父子关系,子shell用法)的更多相关文章

  1. 子shell以及什么时候进入子shell

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 子shell的概念贯穿整个shell,写shell脚本时更是不 ...

  2. linux基础(1)-终端&shell类型&命令&文件系统&命令帮助的获取

    终端 用于与主机交互,必然用到的设备. 物理终端 直接接入本机的显示器和键盘设备:Console. 虚拟终端 附加在物理终端之上的以软件方式虚拟实现的终端,CentOS 6 默认启动 6 个虚拟终端. ...

  3. Linux set、env、declare、export显示shell变量的区别

    目录 Linux中 set.env.declare.export显示shell变量的区别 1. shell局部变量 2. 用户的环境变量 显示shell变量 declare 命令 export 命令 ...

  4. 自学Linux Shell5.1-shell父子关系

    点击返回 自学Linux命令行与Shell脚本之路 5.1-shell父子关系 1 shell常见的种类  bash是Linux标准默认的Shell,是BunrneAgain Shell的缩写,内部命 ...

  5. linux之shell基本认知操作和简单shell练习

    shell编程: 1.Shell的作用 命令解释器,“翻译官”.介于操作系统内核与用户之间,负责解释命令行. shell功能非常强大,除负责解释名另外,还可以将多个命令组合起来,完成复杂的任务,这就是 ...

  6. Linux中shell和子shell一点点理解

    Linux执行脚本有两种方式,主要区别在于是否建立子shell   1.像sh,bash,./命令是用来执行shell脚本的,在bash/sh命令下,脚本文件可以无"执行权限",即 ...

  7. 【目录】linux 编程

    随笔分类 - linux 编程 Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较) 摘要: 一.概述 接着上篇讲的结构化命令,最后讲到了test命令 ...

  8. 进入子shell的各种情况分析

    子shell的概念贯穿整个shell,写shell脚本时更是不可不知.所谓子shell,即从当前shell环境新开一个shell环境,这个新开的shell环境就称为子shell(subshell),而 ...

  9. Shell:子shell概念

    Blog:博客园 个人 目录 shell环境 什么是子shell 子shell的分类 shell环境 每个shell进程有一个自己的运行环境,不同的Shell进程有不同的Shell环境.Shell解析 ...

随机推荐

  1. Docker学习笔记:基础

    docker的概念 :docker是一个可供开发者在容器中 开发 部署 运行 应用的一个平台.通过使用Linux容器去部署应用的方式称为容器化. 基础概念 Images and Container i ...

  2. Robot Framework+python的安装,配置,环境搭建(纯白篇)

    弄了大半天 终于把-Robot Framework-弄好了,总是一个发现问题,一个一个去解决的过程,只是时间嘛,咳咳咳咳 言归正传 第一. 记住了 Robot Framework 的库 只支持 pyt ...

  3. mysql字符集小结

    http://blog.csdn.net/wyzxg/article/details/8779682 author:skatetime:2013/04/09 mysql字符集小结 今天同事阿杰兄发现内 ...

  4. 20175316 盛茂淞 MyCP(课下作业,必做)

    题目要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容为 ...

  5. Python中利用进度条求圆周率

    从祖冲之到现在,圆周率的发展越来越丰富,求法也是越来越快其中: 1.求圆周率的方法: (1)蒙特卡罗法 这是基于“随机数”的算法,通过计算落在单位圆内的点与正方形内的比值来求圆周率PI. 如果一共投入 ...

  6. String常用类

    一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的final类,不能有类.String类对象创建 ...

  7. c++变量的存储方式

    1.名字的作用域 作用域是从空间的角度来分析的,c++的作用域以花括号分隔,定于于所有{ }以外的名字具有全局作用域,定义于{ }以内的名字具有块作用域 2.变量的生命周期 生命周期是从变量存在的时间 ...

  8. dedecms mvc 开发

    目录结构说明: |_app    |___control      控制器(C)    |___model        模型(M)    |___templates    视图模板(V)    |_ ...

  9. javascript小括号、中括号、大括号学习总结

    作为一名编程人员,和括号打交道是必不可少的.你可知道在不同的上下文中,括号的作用是不一样的,今天就让我们简单总结下javascript小括号.中括号.大括号的用法. 总的来说,JavaScript中小 ...

  10. Hadoop2.0源码包简介

    Hadoop2.0源码包简介 1.解压源码包: 2.目录结构: hadoop-common-project:Hadoop基础库所在目录,如RPC.Metrics.Counter等.包含了其它所有模块可 ...