export 原理解析 (Shell Script)

export 的基本作用就是将父shell中的局部变量设置为环境变量,使得该变量可以在子shell中使用。下面设置两种情景对export进行原理解析。

情景
1. 有一个名为myexport.sh的脚本,内容如下:

#!/bin/sh
export MY_PATH=/usr/local

在linux环境中打开终端运行该shell

$sh myexport.sh
$echo $MY_PATH
$

运行该shell后在终端无法看到该环境变量的值。
- 在一个终端用export设置环境变量后再其他终端不可见。

原因
首先要提到进程,进程是一个运行着的程序,是代码的动态形式,进程有如下属性:

  • 独立的内核堆栈
  • 进程控制块
  • 独立的存储空间

由于每个进程有自己独立的存储空间,所以进程间的的数据是不可见的,进程间的交互需要用到进程间通信。每一个shell都是一个独立的进程,所以在一个进程内的操作通常不会影响到另一个进程的内容,也不会被另一个进程所看到。所以上面第二种情景中,不同的终端开启了不同的shell,这些终端是相互独立的进程,彼此无论如何设置环境变量,相互都是不可见的。(写入到系统配置文件中的环境变量那就是通信了。)

export命令用于将父shell的局部变量全局化,这种全局化的意思就是让子shell可见。在父shell中执行一个子shell,会启动一个新的进行——子进程,故子shell即是一个独立于父shell的进程,父子shell的存储空间是相互不可见的(即子shell看不到父shell中的变量),如果想让子shell看到父shell的变量就需要将该变量从父shell的独立存储空间复制到子shell的独立存储空间,子shell看到的变量其实是自己进程空间的内容,而不是父进程的内容,只不过这另个空间的变量的名称和值相同而已。故export并没有采用什么高深的技术,只是将父进程空间的内容复制到子进程而已。

Linux中的父子进程是说父进程可以管理子进程,这种管理主要体现在三个方面:,即父进程可以创建子进程,可以把上面export的例子算作一种管理吧,父进程死则子进程必须死,子进程死对父进程没有影响。其实除了生死之外,父子进程都是独立的进程。(父进程可以生子进程,为什么不叫母进程呢?英文是 parent process,可不是 father process 。这个涉及到了历史和文化问题,不讨论了。)

结果
那么问题来了,如何将情景1中的myexport.sh中的环境变量导入到当前进程中来呢?首先说明,父进程可以将自己的环境变量写入到子进程的空间中,但是子进程无法将自己空间的数据写入到父进程中(至少export命令做不到)。那么想要让子shell中的变量在父shell可见,最好的办法就是不要成为子shell,即只将该shell的内容导入到”父“shell中,而不执行该shell。这样用到的导入命令是”.” 和 ”source“,这就类似于c语言中的”#include”,用法如下:

$. myexport.sh  # or $source myexport.sh
$echo $MY_PATH
/usr/local
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值