一. 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受制于终端。

转载于:https://www.cnblogs.com/MrHSR/p/9639279.html

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

  1. 【Unity3D】3D 物体概念 ① ( 轴心点概念 | 物体的父子关系 | 子节点相对坐标 )

    文章目录 一.轴心点概念 二.物体的父子关系 三.子节点相对坐标 一.轴心点概念 3D 物体的 轴心 Pivot , 是 操作的基准点 , 移动物体 时 , 是 轴心点 沿着指定的坐标轴方向移动 ; ...

  2. Linux shell 学习笔记(3)— shell 父子关系及内建命令

    1. shell 类型 只要用户登录到某个虚拟控制台终端或是在 GUI 中启动终端仿真器,默认的 shell 程序就会开始运行. 默认的交互 shell 会在用户登录某个虚拟控制台终端或在 GUI 中 ...

  3. Mac终端shell类型bash和zsh切换

    查看shell类型 可以执行命令echo $SHELL,先查看终端类型. bash: /bin/bash zsh: /bin/zsh shell类型切换命令 切换到bash 输入命令:chsh -s ...

  4. Linux中shell运行方式,linux脚本中父shell与子shell 执行的几种方式

    本文主要介绍以下几个命令的区别: shell subshell source $ (commond) `commond` Linux执行Scripts有两种方式,主要区别在于是否建立subshell ...

  5. [shell问答录]:命令、进程、子shell...

    2019独角兽企业重金招聘Python工程师标准>>> 前些天在CU上讨论一个统计正在执行的脚本数量的问题过程中,发现自己对于shell如何执行命令方面了解还是甚少,惭愧惭愧...期 ...

  6. Linux编程推荐书籍

    Linux编程推荐书籍一览表(转贴) shell 编程 <LINUX与UNIX SHELL编程指南> BASH宝典: Advanced Bash Scripting Guide (如果你使 ...

  7. aix shell脚本 运行java_Linux中执行shell脚本的4种方法总结

    Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法: 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: c ...

  8. 父Shell与子Shell

    父Shell与子Shell Login Shell 登录主机后,在执行Bash Script之前,其实我们已经处于一个BashShell中. 这个Shell叫login Shell,是将来我们执行任何 ...

  9. 【Linux命令行与Shell脚本编程】第五章 理解 Shell 父子关系 后台进程 协程

    Linux命令行与Shell脚本编程 第五章 理解 Shell 文章目录 Linux命令行与Shell脚本编程 五,理解 Shell 5.1,shell的类型 5.2,shell的父子关系 5.2.1 ...

最新文章

  1. 视觉SLAM学习(三)--------SLAM 综述
  2. python用户登录_【python】实例-用户登录系统
  3. SQL2005 用户自定义类型
  4. 深度学习预训练模型可解释性概览
  5. python raise
  6. CCF 201403-1 相反数
  7. html 无序列表编程一排_HTML 入门笔记
  8. Jquery实现轮播图效果(fadeIn()和fadeOut()方法的应用)
  9. elasticsearch5.5.2离线安装x-pack
  10. 论文自动转代码!IBM印度大三实习生搞了个神奇研究(已中AAAI)
  11. 已知原函数和导函数的关系_根据函数表达式该如何求函数值
  12. 剑指Offer——数组中出现次数超过一半的数字
  13. 【校招VIP】测试脚本语言之系统状态(内存、网络)
  14. Mysql索引优化和锁机制
  15. 深度搜索算法(DFS)
  16. Odoo (hide a menu)隐藏菜单
  17. FreeRTOS原理剖析:空闲任务分析
  18. 从输入一个URL地址到浏览器完成渲染的整个过程
  19. 第十三周项目4—立体类族共有的抽象类
  20. 项目规划管理 - 4

热门文章

  1. 计算机网络基础学测,《计算机网络技术基础》第二1章单元学习测习题-20210622072616.docx-原创力文档...
  2. 获取map第一个的key和value_谁要是再敢用Map传参,我过去就是一JIO
  3. Cadence IC使用教程
  4. matlab fft简单小例子,matlabfft简单例子(A simple example of matlabfft).doc
  5. C语言模块化编程的例子
  6. 智能卡检测控制系统检测m1这么操作_土壤检测实验室仪器设备配置方案
  7. 直方图均衡化算法 matlab,matlab程序_retinex_frankle_mccann+直方图均衡化_去雾算法
  8. PyQt5 笔记6 -- 对话框(QDialog)
  9. mxnet基础到提高(35)-ndarray
  10. python3随笔-相关系数