1. 所谓子shell,即从当前shell 环境中新开了一个shell 环境,这是新开的shell环境就是子shell ,而开启子shell的环境称为该子shell的父shell.子shell和父shell的关系,就是子进程和父进程的关系,只是这个关联的进程是bash进程。

子shell 会从父shell 中继承很多环境变量如:变量 文件描述符 当前工作目录 陷阱等。

不同的子shell继承环境不相同,变量 $BASH_SUBSHELL 可以查看从当前进程开始的子shell的层级数,$BASHPID 查看当前BASH的pid .

子shell 类型

1 fork 是复制进程,它会复制当前进程的副本,从父进程那继承了一些资源,这些资源包括内存中的内容,环境变量和变量,但是他和父进程是完全独立的,他们是一个程序的两个实例。

2 exec 是加载另一个应用程序,替代当前运行的进程,也就是在不创建新的进程的情况下加载一个新进程,在进程执行完全后退出所在的shell环境。为了保证进程的安全,新的且独立的子进程,内容和父进程是一样的(包括变量)

什么时候进入子shell环境,什么时候不进入子shell环境?

1 bash 内置命令 bash的内置命令默认是不开启子shell的,而是直接在当前bash 的环境中执行的,但是如果内置命令放在管道后,则此内置命令将管道左边的进程属于一个进程组,所以会创建子shell。

2 前面说过 bash 命令默认是不开启子进程的,但是bash 命令是个例外,他的情况比较特殊,他做为一个内置命令默认不开启子shell ,但是他命令本身要调用环境变量,使用本身的环境变量来清空了本地变量。所以看上去就会觉得他开了子shell ,从这个角度来说他又开了子进程。说清楚了以上两点就能理解下面命令的执行结果了

![](https://s1.51cto.com/images/blog/201905/22/01ddf7c1c9d3c52786634961d598830f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

小括号开启了子进程,但是变量TITLE继承了父进程的值,所以第二个echo 执行的结果是ceo ,第三个中重新赋值了,则输出的结果是coo ,当退出了子进程,子进程的环境变量被回收,此时加载父进程自身的环境,此时在执行是结果 是ceo .

{} 不开启子进程 所以以上执行的结果是 mage wang wang

() 开启了子进程,所以执行结构是mage wang mage

以上所有皆为借鉴了https://blog.csdn.net/m0_37556444/article/details/83090602

该作者的文章加上自己的理解,解决自己问题,以上仅供参考。

linux shell的组成,理解Linux中子shell的概念相关推荐

  1. 深刻理解linux进程间通信 pdf,深刻理解Linux进程间通信.doc

    深刻理解Linux进程间通信.doc 深刻理解 Linux 进程间通信(IPC)级别 初级 郑彦兴 国防科大计算机学院 2002 年 12 月 11 日 一个大型的应用系统,往往需要众多进程协作,进程 ...

  2. 《Linux游戏编程》——理解Linux文件系统标准

    Linux游戏编程 Programming Linux Games [美]John R. Hall 著 作者:[美]John R. Hall 单位:Loki Software, Inc. 时间:200 ...

  3. linux shell 脚本 2,理解Linux Shell和基本的Shell脚本(2)

    编写第三个脚本 这个脚本演示如何与shell脚本进行交互. #! /bin/bash echo "Hey what's Your First Name?"; read a; ech ...

  4. linux内核进程状态,深入理解 Linux 内核学习笔记(一):进程

    进程 进程是任何多通道程序设计的操作系统中的基本概念,进程通常被定义为程序执行时的一个实例,在 Liunx 的源代码中,进程通常被称为 "任务". 进程描述符 进程描述符的作用是为 ...

  5. linux ls 输出对齐,理解 Linux 中 `ls` 的输出

    ls 的输出会因各 Linux 版本变种而略有差异,这里只讨论一般情况下的输出. 下面是来自 man page 关于 ls 的描述: $ man ls ls - list directory cont ...

  6. linux poweroff关机信号,理解 Linux 中的 Shutdown、Poweroff、Halt 和 Reboot 命令

    在本篇中,我们会向你解释 shutdown.poweroff.halt 以及 reboot 命令.我们会解释当使用可选项时,它们实际做了什么. 如果你想深入管理 Linux 服务器,那么为了有效和可靠 ...

  7. linux cpu load 值,理解Linux系统中的load average(图文版)转

    一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount ...

  8. linux tab的含义,理解Linux中crontab定时器里的 21 含义 - 金牛座, 爬山虎, PHPCreeper, Workerman, Swoole, PHP爬虫引擎, PHP爬...

    在crontab定时器中有如下类似的脚本: 0 2 * * * php /data/test/test.php >/dev/null 2>&1 & 其中 > 代表重定 ...

  9. linux 路由表解析,简单理解Linux路由表

    很多网络问题都跟路由有关,那么首先必须学会看懂路由表,本文将讲述如何读懂路由及如何决策. 在命令行下输入route -n 或 netstat -rn,就可以打印本机的路由表,我的如下: Destina ...

最新文章

  1. linux虚拟化毕业设计,毕业设计(论文)-基于Linux的云校园桌面虚拟化系统的设计与实现(68页)-原创力文档...
  2. JavaScript基础事件(6)
  3. mysql load data 乱码的问题
  4. python int转str_用Python生成抖音字符视频!
  5. 对网易云音乐软件的看法
  6. python生成器的作用是什么_看完这篇,你就知道Python生成器是什么
  7. opcdaclient 对com组件的调用返回了错误hresult_【分享】易语言编程常见错误新手篇...
  8. 【Flutter系列】第一期——初识Dart语言
  9. Windows系统压缩卷时可压缩空间远小于实际剩余空间解决方法
  10. oracle erp fnd api,Sample of API FND_PROFILE (转)
  11. Cf252中子发射能谱模型
  12. c++语言中break的作用,c++ 中break的用法介绍
  13. MT法测速之定量分析
  14. byteBuffer的使用之道
  15. 翼码张波O2O分享9:O2O的其他商务行为
  16. 格拉苏蒂 Glashütte Original
  17. 关于TPR,FPR,precision,accuracy,F1
  18. 中文 gbk gb2312 在线转换 编码码 对照表 自动转换 在线转换(推荐)
  19. LeetCode简单题之有效的回旋镖
  20. 支付服务器维护费怎么做账,税控盘维护费的会计分录是什么?

热门文章

  1. linux dup跨进程使用,linuxC多进程通讯---无名管道dup
  2. pop python3_python3 -- 堆(heapq)
  3. python导入excel模块_Excel到python第一章python利用pandas和numpy模块导入数据
  4. react中的state、props、ref
  5. 遇见不在洛谷收藏里的好题(并没有做)
  6. Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用
  7. ASA 5.0/8.0/9.0 杂记
  8. Create MSSQL Procedure
  9. Css3 display用法
  10. 五大软件设计原则学习笔记3——Liskov 替换原则