[shell] shell 变量生命周期, source, export
1. shell 的派生
用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令, 或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。
此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,脚本shell将终止,返回到执行该脚本之前的shell。
从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。
2. shell中变量的生存周期
生命周期:在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它。
执行一个脚本时,会先开启一个子shell环境, 将父shell中的所有系统环境变量复制过来,这个脚本中的语句就在子shell中执行。父shell的环境变量在子shell中可以调用,但反过来就不行,如果在子shell中定义了环境变量,只对该shell或者它的子shell有效,当该子shell结束时,也可以理解为脚本执行完时,变量消失。
export: 要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。export命令将使系统在创建每一个新的shell时,定义这个变量的一个拷贝。这个过程称之为变量输出。
3. sh, source 与 export
(1) sh于source的区别:直接执行一个脚本文件是在一个子shell中运行的,而source则是在当前shell环境中运行的。
(2) export的作用相当于将本来只作用于该shell的变量设置为系统变量。
脚本中如果只定义了变量未export, 则该变量仍只对该shell有效。 如果用source对脚本进行执行时,如果不加export,就不会在子shell中看到这个变量,因为它还不是一个系统环境变量,如脚本test.sh内容是:
test='value'
直接source执行后,在shell下是能看到这个变量。(sh执行看不到哦~)
但再执行bash开一个子shell时,在test.sh中定义的变量是不会被复制到子shell中的,因为执行脚本文件其实也是在一个子shell中运行,所以我再建另一个脚本文件执行时,是不会输入任何东西的,内容如:echo $test。所以这点特别注意了,明明在提示符下可以用echo $test输出变量值,为什么把它放进脚本文件就不行了。
4. 示例:
1.sh的作用
脚本文件1:sh1.sh
执行:
# sh sh1.sh
# echo $v
# (无输出)
原因:因为执行脚本文件是在当前shell的一个子shell中进行的,所以执行完毕后,回到当前shell进行echo是看不到子shell中变量值的。
===================
脚本文件2:sh2.sh
执行:
# sh sh1.sh
# value
# bash
$ echo $v
$ (无输出)
原因:
当前shell进行 sh sh1.sh 后开了一个执行脚本文件的子shell,暂且称为shell1。sh sh1.sh可以输出值是因为那个echo是写在脚本文件中的,也就是该命令的执行是在执行脚本的shell中进行的,可以看到自己所在shell,也就是shell1的变量值。
再bash新开一个shell之后,是当前shell的子shell,暂且称为shell2。shell1, shell2都是当前shell的子shell,互相看不到对方变量信息。
注意:上面两个echo作用的shell是不同的!!! 脚本文件中的echo作用于 shell1;在命令行的echo作用于当前shell。shell1是当前shell的子shell.
====================
2. source的作用
还是用上面的脚本文件sh1.sh于sh2.sh
脚本文件1:sh1.sh
执行:
# source sh1.sh
# echo $v
# value
# bash
$ echo $v
$ value
===================
脚本文件1:sh2.sh
执行:
# source sh2.sh
# value
# echo $v
# value
# bash
$ echo $v
$ value
可以看到该变量作用在了当前环境,而非仅执行sh脚本文件的shell。
参考:https://www.cnblogs.com/zhangze/articles/1832542.html
[shell] shell 变量生命周期, source, export的更多相关文章
- java 静态变量生命周期(类生命周期)
Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放 ...
- 探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别
探讨C++ 变量生命周期.栈分配方式.类内存布局.Debug和Release程序的区别(一) 今天看博客园的文章,发现博问栏目中有一个网友的问题挺有趣的,就点进去看了下,标题是“C++生存期问题”,给 ...
- java 静态变量生命周期(类生命周期)(转)
Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放 ...
- 【linux】环境变量生命周期的操作方式
目录 前言 1. 修改环境变量 1.1 手动指定 1.2 临时生效 1.3 永久生效 链接 前言 参考: 李柱明博客 本文主要记录 linux 环境变量配置的生命周期. 如,修改环境变量 PATH 是 ...
- static变量生命周期小研究
A页面:定义一个普通类,类包含一个静态变量a,值为:111111111111111111 B页面:修改a的值为:22222222222222 C页面:用来查看a的值 1.在vs2008中,先打开B,再 ...
- C语言 遍历流程 变量生命周期
来自c程序设计 谭浩强 程序编译流程 运行c程序的步骤 在编好一个c程序后.怎样上机进行编译运行呢?一般要经过一下几个步骤: 上机输入和编辑源程序.通过键盘和计算机输入程序,如果发现有错误,要及时改正 ...
- 面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期
1.面向对象主要涉及 构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联 ...
- JavaScript 变量生命周期
变量在它声明时初始化. 局部变量在函数调用时创建,当函数执行完毕后销毁,这和为什么要使用闭包也有一点关系,当然这是另外的话题了. 全局变量在页面(当前页面)关闭后销毁.
- Scala常用变量生命周期
val words = *** //在words被定义时取值 lazy val words = *** //在words被首次使用时取值 def words = *** //在每一次words被使用时 ...
随机推荐
- .NET Core验证ASP.NET密码
.NET Core验证ASP.NET密码 随着.NET Core的持续更新和完善,越来越多的机构已经选择或者升级为.NET Core.但由于技术不完全相同,不可能所有应用/数据库都能无缝迁移,因此AS ...
- DevExpress作为企业赞助商加入.NET基金会
.NET基金会是一个独立的非营利组织,于2014年成立,旨在围绕 .NET 不断增长的开源技术集合,促进开放开发和协作.它是商业和社区开发人员的论坛,通过促进开放性,社区参与和快速创新来增强.NET生 ...
- 为BlueLake主题增加自定义icon图标
一.前言 hexo 的 Bluelake 主题是我一直在用的,简单大方,很喜欢.但最近有了添加自定义 icon 图标的需求,比如,添加 "地址"."扫一扫".& ...
- Java学习笔记(二) 面向对象---构造函数
面向对象---构造函数 特点 函数名与类名相同 不用定义返回值类型 不写return语句 作用 对象一建立,就对象进行初始化. 具体使用情况 class Student { Student(){ Sy ...
- windows丢失文件的恢复技巧
这几天在使用STVD调试程序的时候,突然跳出来一个“共享冲突”错误,当时并没有在意,点确定后赶紧CTRL+S,然后就一直死在那里了... 结束任务,重启STVD,提示找不到main.c,到此也不以为然 ...
- ES6笔记分享 part 2
ECMAScript ES6 从一脸懵逼到灵活运用 接 part 1 New String Methods const id = 'adcd123456x'; const fan = 'I love ...
- Docker底层架构之网络实现
前言 Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 vethpair). 基本原理 首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来 ...
- EL表达式(Exprission language)
EL介绍 Expressive Language, JSP2.0引入,简化jsp开发中对对象的引用,(可以直接读取对象的属性,不需要像之前java脚本那样去做,比较繁琐),使得访问存储在JavaBea ...
- springboot2.x整合spring-data-jpa的问题
今天使用springboot整合spring-data-jpa遇到一些问题,直接使用JpaRepository的getOne()方法是会报错的.报错信息为:org.hibernate.LazyInit ...
- 使用IDEA构建Spring-boot多模块项目配置流程
使用IDEA构建Spring-boot多模块项目配置流程 1.创建项目 点击Create New Project 在左侧选中Spring Initializer,保持默认配置,点击下一步. 在Grou ...