linux shell的组成,理解Linux中子shell的概念
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的概念相关推荐
- 深刻理解linux进程间通信 pdf,深刻理解Linux进程间通信.doc
深刻理解Linux进程间通信.doc 深刻理解 Linux 进程间通信(IPC)级别 初级 郑彦兴 国防科大计算机学院 2002 年 12 月 11 日 一个大型的应用系统,往往需要众多进程协作,进程 ...
- 《Linux游戏编程》——理解Linux文件系统标准
Linux游戏编程 Programming Linux Games [美]John R. Hall 著 作者:[美]John R. Hall 单位:Loki Software, Inc. 时间:200 ...
- linux shell 脚本 2,理解Linux Shell和基本的Shell脚本(2)
编写第三个脚本 这个脚本演示如何与shell脚本进行交互. #! /bin/bash echo "Hey what's Your First Name?"; read a; ech ...
- linux内核进程状态,深入理解 Linux 内核学习笔记(一):进程
进程 进程是任何多通道程序设计的操作系统中的基本概念,进程通常被定义为程序执行时的一个实例,在 Liunx 的源代码中,进程通常被称为 "任务". 进程描述符 进程描述符的作用是为 ...
- linux ls 输出对齐,理解 Linux 中 `ls` 的输出
ls 的输出会因各 Linux 版本变种而略有差异,这里只讨论一般情况下的输出. 下面是来自 man page 关于 ls 的描述: $ man ls ls - list directory cont ...
- linux poweroff关机信号,理解 Linux 中的 Shutdown、Poweroff、Halt 和 Reboot 命令
在本篇中,我们会向你解释 shutdown.poweroff.halt 以及 reboot 命令.我们会解释当使用可选项时,它们实际做了什么. 如果你想深入管理 Linux 服务器,那么为了有效和可靠 ...
- linux cpu load 值,理解Linux系统中的load average(图文版)转
一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount ...
- linux tab的含义,理解Linux中crontab定时器里的 21 含义 - 金牛座, 爬山虎, PHPCreeper, Workerman, Swoole, PHP爬虫引擎, PHP爬...
在crontab定时器中有如下类似的脚本: 0 2 * * * php /data/test/test.php >/dev/null 2>&1 & 其中 > 代表重定 ...
- linux 路由表解析,简单理解Linux路由表
很多网络问题都跟路由有关,那么首先必须学会看懂路由表,本文将讲述如何读懂路由及如何决策. 在命令行下输入route -n 或 netstat -rn,就可以打印本机的路由表,我的如下: Destina ...
最新文章
- linux虚拟化毕业设计,毕业设计(论文)-基于Linux的云校园桌面虚拟化系统的设计与实现(68页)-原创力文档...
- JavaScript基础事件(6)
- mysql load data 乱码的问题
- python int转str_用Python生成抖音字符视频!
- 对网易云音乐软件的看法
- python生成器的作用是什么_看完这篇,你就知道Python生成器是什么
- opcdaclient 对com组件的调用返回了错误hresult_【分享】易语言编程常见错误新手篇...
- 【Flutter系列】第一期——初识Dart语言
- Windows系统压缩卷时可压缩空间远小于实际剩余空间解决方法
- oracle erp fnd api,Sample of API FND_PROFILE (转)
- Cf252中子发射能谱模型
- c++语言中break的作用,c++ 中break的用法介绍
- MT法测速之定量分析
- byteBuffer的使用之道
- 翼码张波O2O分享9:O2O的其他商务行为
- 格拉苏蒂 Glashütte Original
- 关于TPR,FPR,precision,accuracy,F1
- 中文 gbk gb2312 在线转换 编码码 对照表 自动转换 在线转换(推荐)
- LeetCode简单题之有效的回旋镖
- 支付服务器维护费怎么做账,税控盘维护费的会计分录是什么?
热门文章
- linux dup跨进程使用,linuxC多进程通讯---无名管道dup
- pop python3_python3 -- 堆(heapq)
- python导入excel模块_Excel到python第一章python利用pandas和numpy模块导入数据
- react中的state、props、ref
- 遇见不在洛谷收藏里的好题(并没有做)
- Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用
- ASA 5.0/8.0/9.0 杂记
- Create MSSQL Procedure
- Css3 display用法
- 五大软件设计原则学习笔记3——Liskov 替换原则