Linux中父shell 与 子shell :subshell 和 child shell

Linux中的子shell是什么,怎么理解? 文章目录前言Linux中的子shell是什么,怎么理解?01 子shell概念02 子shell 类型03 如何测试是否产生子shell04 什么时候不产生子shell05 什么时候产生子shell05::01 管道命令05::02 执行shell脚本05::03 命令替换($())05::04 使用()组合05::05 放入后台运行的任务05::06 进程替换 前言   如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的 阅读详情

子shell的概念

中文翻译过来的“子shell”叫法,实际上包括了“subshell”和“child shell”。

subshell是指: 对父shell的一个拷贝,共享了父shell的变量,函数,别名等,能用但修改只在subshell中生效。通过()开启subshell。内置变量BASH_SUBSHELL显示subshell的层数。

child shell是指: 重新开启的一个shell,不共享父shell的变量,函数,别名。一个纯新的环境。命令bash或者运行脚本就开启child shell。内置变量SHLVL显示child shell的层数。

The Korn Shell: Unix & Linux Programming Manual :
A subshell is a separate copy of the parent shell, so variables, functions, and aliases from the parent shell are available to the subshell

# BASH_SUBSHELL
> echo $BASH_SUBSHELL
0
> (echo $BASH_SUBSHELL)
1  --进入1层 subshell
> ( ( ( ( (echo $BASH_SUBSHELL) ) ) ) )
5  --进入5层 subshell
> bash 
> echo $SHLVL
1 --进入1层 child shell
> echo $BASH_SUBSHELL
0
> bash 
> echo $SHLVL
2 --进入2层 child shell
> echo $BASH_SUBSHELL
0

一、进入子shell的方式

  1. 直接输入bash(退出 :exit,也无法继承和改变父shell中的普通变量,同脚本):child shell
  2. ()中的命令是在子shell中实现:subshell
  3. 运行脚本,脚本也是在子shell中实现 :child shell

二、差异

child shell是一个全新的环境,不共享父shell中的普通变量,普通变量只能通过export方式实现共享。

subshell 中的普通变量是可以从父shell中继承的,只是不能改变父shell中的变量值。

  • 验证环境:
> cat /proc/version 
Linux version 3.0.101-0.47.55-default (geeko@buildhost) (gcc version 4.3.4 [gcc-4_3-branch revision 152973] (SUSE Linux) ) #1 SMP Thu May 28 08:25:11 UTC 2015 (dc083ee)
  • ()的表现:
> x=10
> echo $x
10
> echo $$ #该命令用于显示当前shell进程号
10497  --父shell的进程号
> (echo $$;echo $x;ps;x=5;echo $x)
10497 -- 实际上还是父shell的进程
10  -- 进程中的x可取父进程中的x
5   -- 进程中的x被改变
  PID TTY          TIME CMD
 3757 pts/0    00:00:00 bash #subshell进程进程号
 3758 pts/0    00:00:00 ps
10497 pts/0    00:00:00 bash #父进程进程号
> echo $x
10   -- 父进程中的x没有改变
  • bash命令
> bash #进入子shell
> echo $$
3609
> ps
  PID TTY          TIME CMD
 3609 pts/0    00:00:00 bash --child shell进程
 5359 pts/0    00:00:00 ps
10497 pts/0    00:00:00 bash
> echo $x
   -- 空
> x=5;echo $x
5 
> exit #退出子进程
> echo $$ 
10497 --回到父shell
> echo $x
10 -- 父shell中x没有改变
  • 脚本中子shell的表现:
    将echo $$;echo $x;ps;x=5;echo $x写入test.sh中
> echo $x
10 
> ./test.sh 
 8794 --子shell的进程号
          -- 无法获取父shell中的变量值
  PID TTY          TIME CMD
 8794 pts/0    00:00:00 sh -- child shell 进程
 8795 pts/0    00:00:00 ps
10497 pts/0    00:00:00 bash
5 -- 子shell中定义的变量

> echo $x
10 --父shell中值不变

三、差异的原因

()的子shell能获取父shell中变量值的原因因为是subshell,$()一样能够获取到父shell中变量的值。$()命令的()表现和单独的()一样,也是在子shell中运行,但能访问父shell变量,但不能改变父shell变量。

参考:
https://stackoverflow.com/questions/19462291/bash-subshell-parentheses-vs-dollar-parentheses
https://tldp.org/LDP/abs/html/subshells.html

https://www.cnblogs.com/ziyunfei/p/4803832.html

JSSIP实战:5分钟搞定WebRTC电话功能(附完整代码示例) 本文通过JSSIP库实战演示如何在Web应用中快速集成WebRTC电话功能。文章提供了从环境准备、SIP服务器连接到完整代码示例的详细步骤,涵盖用户注册、拨号接听、媒体流处理等核心环节,并针对常见问题给出排查方案,帮助开发者高效实现网页端实时语音通信。 阅读详情

相关推荐

基于FastLIO2与TEB算法的机器狗自主导航系统实战

本文详细介绍了如何为机器狗构建一套基于FastLIO2与TEB算法的自主导航系统。通过整合FastLIO2激光惯性里程计实现精准定位,并采用TEB局部规划器进行灵活路径规划与动态避障,解决了传统方案在复杂地形下反应慢、易碰撞的问题。文章提供了从环境搭建、算法部署、地图转换到系统调试的完整实战指南,帮助开发者实现机器狗的稳健自主行走。

beer8的博客 321

Linux环境变量失效的根源:fork-exec模型与export机制解析

环境变量是进程运行时的关键配置载体,其本质是进程私有的内存快照,而非全局共享配置。其生命周期、可见性与传递规则由Linux的fork-exec进程模型严格约束:父进程通过export标记的变量,仅在fork后被子进程继承,无法反向影响祖先或同级进程。这一机制决定了export不是魔法赋值,而是环境传递的开关。技术价值在于精准控制依赖注入边界,避免污染与冲突;典型应用场景包括CI/CD流水线调试、Hadoop/StarRocks等大数据组件集成、Android Framework JNI调用、Cadence

weixin_33694620的博客 390

从零到一:用AXI DataMover在Zynq MPSoC上实现高效DMA传输(附Vitis HLS驱动示例)

本文详细介绍了如何在Xilinx Zynq UltraScale+ MPSoC平台上使用AXI DataMover实现高效的DMA数据传输。通过解析AXI DataMover架构、Vivado工程配置、Vitis HLS驱动开发及性能优化技巧,帮助开发者快速构建高性能数据传输通道,并提供了可直接复用的代码示例。

weixin_42520796的博客 425

Shell脚本的常用执行方式、bash 和 sh 的关系、子shell、Centos 默认的解析器是 bash、Linux 提供的 Shell 解析器、Shell 概述、Shell 脚本入门

采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)、采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)、在脚本的路径前加上“.”或者 source(了解)原因: 前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则 子 shell 关闭,回到父 shell 中。第三种,也就是使用在脚本路径前加“.”或者 source 的方式,`可以使脚本内容在当前 shell 里执行,而无需打开子 shell!`这也是为什么我们每次要修改完

Redamancy06的博客 2380

Circos在Windows下的安装教程

这里写自定义目录标题Circos简介安装Perl 的安装Circos安装安装及解压安装Modules测试用例官方文档 Circos简介 (来源官网:http://circos.ca/software/readme/ O.INTRODUCTION部分) Circos is a program for the generation of publication-quality, circularly composited renditions of genomic data and related annot

qq_42318911的博客 1661

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

【Linux扩展】六、shell ——shell概述、shell脚本入门(父子shell的关系、echo)、变量

【Linux扩展】六、shell ——shell概述、shell脚本入门(父子shell的关系、echo)、变量

m0_62783065的博客 679

RDkit入门

今天开始写RDkit的入门教程,每天学习和写一小点,相信一句话“不积跬步无以至千里,不积小流无以成江海”,所以就慢慢来,一点一滴积累叭,从最简单的开始喽希望自己每天都能保持写博客的好习惯,把自己的代码笔记就极在这里,RDkit一块啃了很久的骨头,今天终于要下定决心,好好总结一波了,希望保持这个更新的频率,每天都能有所学。............

博客而已 6683

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

第五章 理解 Shell 父子关系 后台进程 协程

qq_44765647的博客 1476

PyTorch深度学习实战(3)——使用PyTorch构建神经网络

PyTorch 是一个用于构建深度神经网络的库,具有灵活性和可扩展性,可以轻松自定义模型。在本节中,我们将使用 PyTorch 库构建神经网络,利用张量对象操作和梯度值计算更新网络权重,并利用 Sequential 类简化网络构建过程,最后还介绍了如何使用 save、load 方法保存和加载模型,以节省模型训练时间。

盼小辉丶的博客 8万+

PCL Fast Global Registration 快速全局配准(源码版)

Fast Global Registration(FGR)是一种经典的点云粗配准算法,已集成到Open3D和CloudCompare等软件中。本文介绍了该算法的源码实现及优化方法,包括如何通过修改源码直接读取点云进行配准,而不依赖文件中读取特征描述子。文章还提供了关键参数设置(如最大迭代次数、匹配距离等)。算法实现简单高效,未来计划发布基于纯PCL的版本。源码和论文链接已附上,供开发者参考。

点云侠的博客 383

linux shell 入门学习笔记13 父子shell

从上面的父子shell的图表中可以看到:1.使用source和点,执行脚本,旨在当前的shell环境中执行生效2.指定/bin/bash解释器运行脚本,是开启了一个subshell,开启子shell运行脚本命令。3…/script,都会指定shebang,通过解释器运行,也是开启subshell运行命令。

qq_20252351的博客 1244

3步搞定.NET Core在UOS上的部署?手把手教你从零到上线!

本文详细介绍了如何在统信UOS系统上部署.NET Core应用程序的完整流程。首先,通过安装.NET Core SDK,确保UOS系统能够编译和运行C#代码。接着,创建一个简单的控制台应用,并验证其本地运行情况。最后,通过发布应用、传输文件到UOS服务器,并解决权限问题,确保应用能够在UOS上顺利运行。文章还提供了常见问题的解决方案,如依赖缺失、权限不足和服务启动失败等,帮助开发者避免常见陷阱。通过本文的指导,开发者可以轻松将.NET Core应用部署到UOS系统,并实现24/7的稳定运行。

java专栏 587

父子shell

child shell 是一个全新的 shell 实例,而 subshell 是在当前 shell 环境中创建的一个临时环境。

2301_79937517的博客 1001

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux:subshell(子shell)和childprocess(子进程)

从其中的getpid()=4064924可以看出,该bash进程的PID为4064924。从getppid()=4064921可以看出,该bash进程父进程的PID为4064921,这是strace进程的PID,而strace进程的父进程是终端内运行的bash。在进行这个话题之前,首先要了解Linux系统中一个进程是如何创建的,当一个命令被执行时,首先会在当前进程创建一个子进程,这个进程除了少数地方(例如进程PID和PPID),几乎和当前进程完全一样,使用的系统调用是fork()或者clone()。

保持终身学习的能力,温故而知新 1646

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux中的Sub shell与Child shell(a child process that happens to be a shell)

在读《linux命令行与shell脚本编程大全》这本书的时候,第五章shell的父子关系,有这样一条命令很有趣 $ coproc ( sleep 10; sleep 2 ) coproc命令可以在后台生成一个子shell(sub or child?),并在这个子shell中执行命令。 而命令分组的一种,即进程列表(;)也会生成一个子shell(sub or child?)来执行对应命令。 ...

Badiu首席玩耍官的博客 1327

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RVC WebUI 完全指南:10分钟语音训练音色,实时变声延迟降到90ms

Retrieval-based-Voice-Conversion-WebUI(RVC WebUI)是一套免费开源的语音音色转换/变声框架:用 10 分钟到 50 分钟的低底噪音频就能训练出一个音色模型,推理时通过 top1 检索替换输入源特征为训练集特征,从机制上杜绝"音色泄漏"。内置的实时变声界面端到端延迟为 170ms,换用 ASIO 输入输出设备后可以压到 90ms。 ## 安装依赖并启动

gitblog_01019的博客 271

Linux export命令深度解析:环境变量传播机制与实战避坑指南

环境变量是Unix/Linux进程间传递配置信息的基础机制,其核心原理在于fork-exec模型下的环境块(environ)复制规则。export命令并非赋值操作,而是为shell变量打上‘可传递至子进程’的导出标记,直接影响PATH、JAVA_HOME、LD_LIBRARY_PATH等关键变量的可见性与生命周期。理解export的作用域边界、shell类型差异、持久化层级(~/.bashrc vs /etc/environment vs Docker ENV)及安全限制(ARG_MAX、敏感变量泄露),是

weixin_34332905的博客 412

Shell wait命令详解:进程并发控制与生命周期管理

wait是Shell中实现进程同步与并发控制的核心命令,其本质是事件驱动的进程生命周期管理机制——通过等待指定PID或作业结束,解决后台任务失控、退出码丢失、时序混乱等关键问题。它不同于sleep的时间阻塞,而是精准响应子进程终止信号,支撑资源隔离、错误捕获和优雅退出。在批量处理、部署脚本、ADB自动化及高IO场景中,结合PID管理、trap信号处理与wait -n竞速模式,可构建稳定可靠的并发流程。本文深入解析wait的三种工作模式、常见陷阱及生产级工程实践。

weixin_34209851的博客 242

如何用IDM激活脚本快速冻结试用期?完整上手指南

深夜把整部高清剧集丢进 IDM 排队下载,它却弹出试用期到期提醒,剩余天数只剩个位数。开源项目 IDM激活脚本(IDM-Activation-Script)就是为此准备的:帮你冻结试用期、让弹窗彻底消失,全程无需写代码。 ## IDM激活脚本原理:冻结试用期是怎么实现的 先说结论:请选 Freeze trial(冻结试用期),别选菜单里的"激活"——后者目前并不可靠,官方与社区都推荐前者。

gitblog_00806的博客 212

3.7ExecutingCommands

3.7ExecutingCommands

qq_53318060的博客 522

Updating -- Python知识

学得快忘得也快,记录一些Python小知识

Rolei的博客 1万+

子shell以及什么时候进入子shell

最近写shell脚本程序,碰到一个问题:需要一个全局变量来反复保存和更新一些统计信息,但每次在shell主程序的函数中更新完后,主程序中的值却没有变化,仍是初始值 后来发现执行更新操作的函数是后台执行的,若将其变成前台执行则全局变量每次都可以顺利更新和保存。 查得下面这篇文章,原来后台执行的函数是在子shell中执行的,父子shell和父子进程一样,都是单通的,子shell所继承的父shell变量是一个副本,其改动只在子shell中生效,并不会影响父shell,要想将其回传父shell,则需要考虑进程间

团长的专栏 1439

shell简单介绍

2501_92618543的博客 419

Shell及 子Shell关系

Linux登陆主机后,在执行Script之前,其实我们已经处于一个shell中,即Login Shell ,它是将来要执行Script的父shell,如root账号默认为/bin/bash        Linux下每个账号都可以自定义Login Shell,在/etc/passwd文件中,Login  Shell定义在第七个字段,如果这个字段不存在,不合法或执行失败,则无法登陆主机    

VmBoys的博客 2054

Linux-理解shell

shell的类型、交互shell和系统默认shell、安装zsh shell程序、shell的父子关系、命令列表、命令分组、使用命令分组创建子shell、子shell 的用法、shell的非内建命令和内建命令。

weixin_57370131的博客 1350
上一篇: python获取变量名的字符串
下一篇: hadoop fs、hadoop dfs、hdfs fs、hdfs dfs区别
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值