理解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

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

原文地址:https://blog.51cto.com/2858259639/2398725

时间: 2024-08-30 00:40:16

理解Linux中子shell的概念的相关文章

理解 Linux shell 中的一个方言:2>&1

理解 Linux shell 中的一个方言:2>&1 2016-11-14 杜亦舒 前言 在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 如果是刚开始接触Linux,这个东西的确不好理解,因为他没有直观的含义,不像一个命令,例如 cp是 copy 的简写,很好记. 我以前刚用Linux时就对这个东西迷糊了一段时间,今天刚好看到一篇文章介绍他,感觉很有必要总结出来,分享给还不是很理解这个方言的朋友. 下面看一个命令示例,然后分析下他是如何工作的: l

深入理解 Linux Cgroup 系列(一):基本概念

原文链接:深入理解 Linux Cgroup 系列(一):基本概念 Cgroup 是 Linux kernel 的一项功能:它是在一个系统中运行的层级制进程组,你可对其进行资源分配(如 CPU 时间.系统内存.网络带宽或者这些资源的组合).通过使用 cgroup,系统管理员在分配.排序.拒绝.管理和监控系统资源等方面,可以进行精细化控制.硬件资源可以在应用程序和用户间智能分配,从而增加整体效率. cgroup 和 namespace 类似,也是将进程进行分组,但它的目的和 namespace 不

Linux 的 Shell

一:Shell 概念 shell 这个词都不陌生,意思是 "壳" 是介于OS 核心与用户之间的一层交互,在linux系统中,用户可以通过命令终端,使用shell 命令向下传达自己的意愿, 驱使kernel 调动硬件实现自己的目的! 鸟哥私房菜中的图片: 通俗的理解就是一个文本命令集合,可以更加直观有效的操控Kernel来实现我们的目的,其中shell script更是许多项目实践中常用的脚本语言! 二:Shell 管理 shell的种类有很多,对linux系统而言会有一个管理,那些种类

理解 Linux 的硬链接与软链接

理解 Linux 的硬链接与软链接 从 inode 了解 Linux 文件系统 硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称  inode),而索引节点对象是 Linux 虚拟文件系统 (VFS) 的四个基本概念之一.通过剖析硬链接与软链接的联系与区别,我们可更好的了解  Linux 中 VFS 这一通用文件模型.并让 Linux 普通用户和系统管理员正确使用硬链接与软链接,帮助文件系统开发者获取 inode  的相关知识. 1

深入理解Linux操作系统守护进程的意义

Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的.守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作业规划进程crond.打印进程lqd等.有些书籍和资料也把

Linux Bash Shell编程快速入门

BASH 的基本语法 最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     最简单的例子 -- Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH. 用 vi 编辑器编辑一个 hello 文件如下: #!/bin/bash# This is a very simple

Linux 基础入门----基本概念及操作

本节联练习主要有: 1.环境介绍 2.常用 Shell 命令及快捷键 3.Linux 使用小技巧 一.Linux 桌面环境介绍 相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在 Unix/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件,类似 Windows95 之前的Windows 的图形界面实则也只是运行在 DOS 环境的一套软件.而 Linux 上的这套软件以前是XFree86,现在则是 xorg(X.Org),而

Linux Bash Shell入门教程

BASH 的基本语法 最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     最简单的例子 -- Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH. 用 vi 编辑器编辑一个 hello 文件如下: #!/bin/bash # This is a very simple

理解Linux的进程,线程,PID,LWP,TID,TGID

在Linux的top和ps命令中,默认看到最多的是pid (process ID),也许你也能看到lwp (thread ID)和tgid (thread group ID for the thread group leader)等等,而在Linux库函数和系统调用里也许你注意到了pthread id和tid等等.还有更多的ID,比如pgrp (process group ID), sid (session ID for the session leader)和 tpgid (tty proce