相关阅读Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482在Linux中内建命令export主要用于创建环境变量或者把一个普通变量导出为环境变量。在导出的同时也可以直接为该变量赋值。简单来说export的核心作用就是让变量不仅在当前Shell中可见还能够被其后创建的子进程继承。下面是该命令的语法。用法 export [-pfn] ([name[word]])* 选项 -p 指定该选项会打印出当前进程的所有环境变量被导出的变量及其值 -f 指定导出一个函数名 -n 取消一个环境变量被导出的变量或导出函数的导出属性环境变量可以看作是一类特殊的变量。普通变量通常只在当前Shell进程中有效而环境变量除了在当前进程中可用之外还会被该进程创建的子进程继承。系统中默认存在的很多环境变量通常使用大写变量名。后文中如果没有特别说明统一将“被导出的变量”称为环境变量。例如$SHELL这个环境变量保存的是当前用户默认登录Shell的路径可以通过echo查看其值[***EDA ~]$ echo $SHELL /bin/bash如果执行export命令时不带任何变量名参数那么它的效果与export -p基本相同都会打印出当前进程中所有已经导出的变量及其值。顺带一提env命令也能起到类似的查看效果。[***EDA ~]$ export declare -x SHELL/bin/bash declare -x WINDOWPATH1 declare -x KDEDIRS/usr declare -x LANGen_US.UTF-8 declare -x PrimeTime_HOME/opt/Synopsys/PrimeTime2018/pts/O-2018.06-SP1 declare -x Synopsys_Dir/opt/Synopsys ***** [***EDA ~]$ export -p declare -x SHELL/bin/bash declare -x WINDOWPATH1 declare -x KDEDIRS/usr declare -x LANGen_US.UTF-8 declare -x PrimeTime_HOME/opt/Synopsys/PrimeTime2018/pts/O-2018.06-SP1 declare -x Synopsys_Dir/opt/Synopsys *****在一个Shell进程中定义的普通变量默认情况下是无法被子进程访问到的。例如[***EDA ~]$ aaa1 #在当前进程创建一个变量 [***EDA ~]$ bash #在当前进程运行另一个bash子进程 [***EDA ~]$ echo $aaa #此时尝试访问$aaa失败 (nothing output)这里之所以没有输出是因为aaa只是当前Shell中的普通变量它并没有被导出因此不会被新的bash子进程继承。如果把一个普通变量通过export导出那么它就会变成环境变量从而能够被子进程继承。例如[***EDA ~]$ bbb1 #在当前进程创建一个变量 [***EDA ~]$ export bbb #导出该变量使其成为环境变量 [***EDA ~]$ bash #在当前进程运行另一个bash子进程 [***EDA ~]$ echo $bbb #此时尝试访问$bbb成功 1也可以一步完成定义和导出例如export bbb1。这和先赋值、再执行export bbb的效果是一致的。在说明环境变量继承时很多人会想到直接修改诸如SHELL这样的系统默认环境变量来做实验。但实际演示时这类变量往往不太合适。原因在于即使子进程继承了父进程的环境变量新启动的bash在初始化过程中还会继续读取配置文件并对某些环境变量重新赋值。这样一来父进程中临时改过的值可能会很快被覆盖掉。例如[***EDA ~]$ SHELL1 #改变系统默认环境变量 [***EDA ~]$ echo $SHELL #在当前进程中环境变量的值被改变 1 [***EDA ~]$ export #在当前进程中环境变量的值被改变 ***** declare -x SHELL1 ***** [***EDA ~]$ bash #在当前进程运行另一个bash子进程 [***EDA ~]$ echo $SHELL #环境变量的值虽然被继承但紧接着初始化了 /bin/bashexport -n可以取消一个变量的导出属性。也就是说变量本身仍然存在但它会从环境变量重新变回普通变量。例如[***EDA ~]$ ccc1 #在当前进程创建一个变量 [***EDA ~]$ export ccc #导出该变量使其成为环境变量 [***EDA ~]$ bash #在当前进程运行另一个bash子进程 [***EDA ~]$ echo $ccc #此时尝试访问$ccc成功 1 [***EDA ~]$ exit #退出bash子进程 [***EDA ~]$ export -n ccc #取消变量导出使其成为普通变量 [***EDA ~]$ echo $ccc #当前进程仍可以访问 [***EDA ~]$ bash #在当前进程运行另一个bash子进程 [***EDA ~]$ echo $ccc #此时尝试访问$ccc失败 (nothing output)除了变量以外export还可以通过-f选项导出函数使函数可以在子进程中使用。例如[***EDA ~]$ my_function() { #在当前进程创建一个函数 echo This is my function. } [***EDA ~]$ export -f my_function #导出该函数 [***EDA ~]$ bash [***EDA ~]$ my_function This is my function.如果希望某个环境变量在每次打开bash时都自动存在那么只在当前命令行中执行一次export是不够的。因为这种设置只对当前Shell及其子进程有效退出后就失效了。由于.bashrc文件中的内容会在bash启动时被读取并执行因此如果要设置默认环境变量通常需要把相应的export命令写入配置文件中。如下图所示。export是Linux Shell中一个非常常用的内建命令它的核心作用是将变量导出为环境变量使其能够被子进程继承。本文涉及的几个重点可以概括为普通变量默认只在当前进程中有效经过export导出的变量会变成环境变量环境变量可以被子进程继承export -n可以取消变量的导出属性export -f可以导出函数如果想设置默认环境变量应将export写入配置文件中。