[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

原文地址:https://www.cnblogs.com/shiyublog/p/12371135.html

时间: 2024-10-24 14:19:53

[shell] shell 变量生命周期, source, export的相关文章

java 静态变量生命周期(类生命周期)

Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放内存空间.static变量的生命周期取决于类的生命周期 类初始化顺序: 静态变量.静态代码块初始化 构造函数 自定义构造函数 结论:想要用static存一个变量,使得下次程序运行时还能使用上次的值是不可行的.因为静态变量生命周期虽然长(就是类的生命周期),但是当程序执行完,也就是该类的所有对象都已经

关于堆内存和普通变量生命周期的问题

来源:孙鑫老师c++教程第7集 在创建非模态对话框时 void CMyboleView::OnDialog(){ // TODO: Add your command handler code here方法一 TestDlg *ptdlg=new TestDlg(this); ptdlg->Create(IDD_DIALOG1,this); ptdlg->ShowWindow(TRUE); 方法二 CDialog1 dlg; dlg.Create(IDD_DIALOG1,this); dlg.S

Shell环境变量以及set,env,export的区别

shell环境变量的分类以及set env export的区别: set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样 env:显示(设置)用户变量变量 export:显示(设置)当前导出成用户变量的shell变量. 举个例子来讲: [www.linuxidc.com@linuxidc ~]$ aaa=bbb –shell变量设定 [www.linuxidc.com@linuxidc ~]$ e

Java内存区域和变量生命周期

在一台电脑上的内存存储区域分为6种: 1.寄存器: 寄存器是运行最快的,寄存器在系统中早就已经存在了,寄存器的数量是有限的,被严格要求            Java程序员不能显示的调用寄存器 2.栈:   栈中存储着基本数据类型的变量以及引用变量 栈中元素在超出其生命周期后会自动销毁             栈中元素一经创建,系统会为其分配内存空间,在其内存空间里存取的值是真值(真实存放的值)            栈中元素互不影响 每个在栈中的变量都有其自己对应的内存空间 里面存取着值  

static变量生命周期小研究

A页面:定义一个普通类,类包含一个静态变量a,值为:111111111111111111 B页面:修改a的值为:22222222222222 C页面:用来查看a的值 1.在vs2008中,先打开B,再打开C,C显示a的值为:222222222222222 就算用ie打开B,用chrome打开C,C仍然显示为:22222222222222,证明与客户端无关: 2.在IIS中,直接打开C,显示为:11111111111111111 证明静态变量的值与服务器有关 3.在IIS中,先打开B,再打开C,C

面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期

1.面向对象主要涉及  构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联性. 在C++中,通过抽象数据类型(abstract data type, ADT),在类中定义数据和函数,来实现数据和函数直接的绑定. C++成员数据:static.nonstatic C++成员函数:static.nonstatic.virtual C++中的类class从面向对象理论出发,将变

switch case里的变量生命周期

1 #include <stdio.h> 2 3 int main() 4 { 5 6 int isw = 0; 7 switch(isw) { 8 9 case 1: //just lables 10 int a = 0; //a在这里定义,有效期到switch的},如果直接走了case2,此变量是没有定义的 ,所以编译不过. 11 break; //trans to goto statement 12 case 2: 13 break; 14 default: 15 break; 16 }

static变量生命周期 在php和java中的不同

<%! static class Count { private static int count = 0; public static int getCount(){ count++; return count; } } %> <% out.print(Count.getCount()); %> 通过浏览器连续访问,会分别输出:1,2,3,4,5,6,........ <?php class Count{ private static $count = 0; public

Scala常用变量生命周期

val words = *** //在words被定义时取值 lazy val words = *** //在words被首次使用时取值 def words = *** //在每一次words被使用时取值 原文地址:https://www.cnblogs.com/itboys/p/9862132.html