Linux编程 9 (shell类型,shell父子关系,子shell用法)
一. 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用法)的更多相关文章
- 子shell以及什么时候进入子shell
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 子shell的概念贯穿整个shell,写shell脚本时更是不 ...
- linux基础(1)-终端&shell类型&命令&文件系统&命令帮助的获取
终端 用于与主机交互,必然用到的设备. 物理终端 直接接入本机的显示器和键盘设备:Console. 虚拟终端 附加在物理终端之上的以软件方式虚拟实现的终端,CentOS 6 默认启动 6 个虚拟终端. ...
- Linux set、env、declare、export显示shell变量的区别
目录 Linux中 set.env.declare.export显示shell变量的区别 1. shell局部变量 2. 用户的环境变量 显示shell变量 declare 命令 export 命令 ...
- 自学Linux Shell5.1-shell父子关系
点击返回 自学Linux命令行与Shell脚本之路 5.1-shell父子关系 1 shell常见的种类 bash是Linux标准默认的Shell,是BunrneAgain Shell的缩写,内部命 ...
- linux之shell基本认知操作和简单shell练习
shell编程: 1.Shell的作用 命令解释器,“翻译官”.介于操作系统内核与用户之间,负责解释命令行. shell功能非常强大,除负责解释名另外,还可以将多个命令组合起来,完成复杂的任务,这就是 ...
- Linux中shell和子shell一点点理解
Linux执行脚本有两种方式,主要区别在于是否建立子shell 1.像sh,bash,./命令是用来执行shell脚本的,在bash/sh命令下,脚本文件可以无"执行权限",即 ...
- 【目录】linux 编程
随笔分类 - linux 编程 Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较) 摘要: 一.概述 接着上篇讲的结构化命令,最后讲到了test命令 ...
- 进入子shell的各种情况分析
子shell的概念贯穿整个shell,写shell脚本时更是不可不知.所谓子shell,即从当前shell环境新开一个shell环境,这个新开的shell环境就称为子shell(subshell),而 ...
- Shell:子shell概念
Blog:博客园 个人 目录 shell环境 什么是子shell 子shell的分类 shell环境 每个shell进程有一个自己的运行环境,不同的Shell进程有不同的Shell环境.Shell解析 ...
随机推荐
- Python3.7 Scrapy crawl 运行出错解决方法
安装的是Python3.7,装上依赖包和scrapy后运行爬虫命令出错 File "D:\Python37\lib\site-packages\scrapy\extensions\telne ...
- JS阻止事件冒泡的3种方法之间的不同
什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这 ...
- [入门]在Mac OS X下使用和配置Android Studio
Android Studio可谓是安卓开发的XCode,流畅的速度+顺眼的UI足以秒杀Eclipse.在Mac OS X可以通过如下的途径获得Android Studio 最新版本的Android ...
- 获取父窗口的xxx节点的方法
window.parent.document.getElementById("xxx");获取父窗口的xxx节点$("#myEle", window.paren ...
- 关于get和post请求的区别
1.标准答案 GET在浏览器回退时是无害的,而POST会再次提交请求. GET产生的URL地址可以被Bookmark,而POST不可以. GET请求会被浏览器主动cache,而POST不会,除非手动设 ...
- appium + java + WebDriverAgent实现IOS app启动
Appium v1.8.1 <dependency> <groupId>io.appium</groupId> <artifactId>ja ...
- 整理CSS中display flex(布局利器)
关于display:flex布局,有人了解颇深,我也是看着别人的东西学习的. display:flex的布局是什么.基本概念之类的我根本就不了解,只会用.每次看到概念之类的东西,我都是扫一眼就过去. ...
- rails应用的部署
简单部署 RAILS_ENV=production rake secret /etc/profile export SECRET_KEY_BASE=刚才生成的密钥 source /etc/profil ...
- Spring Boot中使用Spring Security进行安全控制转载来自翟永超
我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(比如:Apache ...
- 闵可夫斯基和(Mincowsky sum)
一.概述 官方定义:两个图形A,B的闵可夫斯基和C={a+b|a∈A,b∈B}通俗一点:从原点向图形A内部的每一个点做向量,将图形B沿每个向量移动,所有的最终位置的并便是闵可夫斯基和(具有交换律) 例 ...