一. 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. win10在Pycharm中安装scrapy

    查看官网说明 发现推荐是安装Anaconda 或 Miniconda,这东西有点大而全,感觉目前用不上.所以没这样做. 直接安装scrapy 如果直接装会报错的,参考文章就可以解决. 这里记一下组件下 ...

  2. eclipse 安装 maven

    一共需要3个步骤,1 安装maven环境   2  安装eclipse的maven插件   3 配置eclipse的maven环境 1. 安装maven环境 1.1  下载    去网址http:// ...

  3. Sorl 4.10 入门合集

    Sorl4.10 + Tomcat 7.0  win7环境下的安装 1.首先是到apache官网下载sorl 4.10 ,解压 2.进入路径\solr-4.10.4\example\webapps,拷 ...

  4. [少数派]如何学习Git

    用玩游戏的方式学习 Git 目录 为什么要学习 Git 怎么学习 Git Learn Git Branching 其他学习资源 用游戏的方式来学习,是一种有趣而高效的方式. 从刚接触电脑时的打字练习软 ...

  5. Codeforces 845 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意:2n2n2n个人下棋,分为两个阵营,每个阵营nnn个人,每个人有一个积分,积分高的能赢积分低的,问如果你可以随意选人,然 ...

  6. php常用字符串方法

    chop()        移除字符串右侧的空白字符或其他字符 ltrim()        移除字符串左侧的空白字符或其他字符 rtrim()        移除字符串右侧的空白字符或其他字符 tr ...

  7. 解决ORA-30036:无法按8扩展段(在还原表空间‘XXXX’中)

    在update一数据量很大的表时,提示“ORA-30036:无法按8扩展段” 度娘了下原因与解决办法:   1.查询了一下undo表空间的使用,发现已经超过了80% SELECT a.tablespa ...

  8. Day10 (黑客成长日记) Urllib库的使用

    什么是Urllib: Urllib是python内置的HTTP请求库包括以下模块urllib.request 请求模块urllib.error 异常处理模块urllib.parse url解析模块ur ...

  9. BP神经网络 详解模板

    %原始数据输入 P=[ - 6.142 - 27.5 5.068 - 31.7 5.196 - 34.1 6.362 - 31.54 6.472 - 30.17 6.578 - 29.53 6.351 ...

  10. 解决Ubuntu自带编译器不好使问题

    解决Ubuntu自带编译器不好使问题 1.删除Ubuntu自带的tiny版本,这个版本用起来很别扭不好使. 2.安装full版本的vim 3.显示效果:full版本. 之前自带的版本: