Shell脚本中的export
shell 与 export命令
⽤户登录到Linux系统后,系统将启动⼀个⽤户shell。在这个shell中,可以使⽤shell命令
或声明变量,也可以创建并运⾏shell脚本程序。运⾏shell脚本程序时,系统将创建⼀个⼦shell。
此时,系统中将有两个shell,⼀个是登录时系统启动的shell,另⼀个是系统为运⾏脚本程序创建
的shell。当⼀个脚本程序运⾏完毕,脚本shell将终⽌,返回到执⾏该脚本之前的shell。
从这种意义上来说,⽤户可以有许多 shell,每个shell都是由某个shell(称为⽗shell)派⽣的。
在⼦shell中定义的变量只在该⼦shell内有效。如果在⼀个shell脚本程序中定义了⼀个变量,
当该脚本程序运⾏时,这个定义的变量只是该脚本程序内的⼀个局部变量,其他的shell不能引⽤它,要使某个变量的值可以在其他shell中被改变,可以使⽤export命令对已定义的变量进⾏输出。
export命令将使系统在创建每⼀个新的shell时,定义这个变量的⼀个拷贝。
这个过程称之为变量输出。
[例]
在本例中,变量myfile是在dispfile脚本程序中定义的。
然后⽤export命令将变量myfile输出⾄任何⼦shell,例如当执⾏printfile脚本程序时产⽣的⼦shell。dispfile脚本程序清单:
myfile=”List”
export myfile
echo “Displaying $myfile”
pr –t –n $myfile
printfile
printfile脚本程序清单:
echo “Printing $myfile”
lpr $myfile&
运⾏结果:
$dispfile
Displaying List
1 screen
2 modem
3 paper
Printing List
$
export 功能说明:设置或显⽰环境变量。
语  法:export [-fnp][变量名称]=[变量设置值]
补充说明:在shell中执⾏程序时,shell会提供⼀组环境变量。export可新增,修改或删除环境变量,供后续执⾏的程序使⽤。export的效⼒仅限于该次登陆操作。
参  数:
 -f  代表[变量名称]中为函数名称。
 -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执⾏环境中。
 -p  列出所有的shell赋予程序的环境变量。
从学习export命令理解到的Shell环境和变量⽣存期
  最近在学习BASH的export命令时碰到了⼀个难道(书上说export是将⾃定义变量变成
系统环境变量):我在⼀个脚本⽂件中定义⼀个了变量,然后export变量,按照我⾃⼰的想法,
执⾏完这个脚本后,在提⽰符下⼀定可以⽤echo显⽰出它的值,可结果却不是这样,脚本执⾏完后
⽤set根本看不到有这个变量存在。为什么呢?我百思不得其解,最后将问题贴出来,⼀位前辈告诉
我说⽤source+脚本⽂件就可以了,我试了⼀下果然可以,但⼀个新的问题⼜出来了。我将脚本中
export命令删除后,⽤source⼀样可以。那这个export好像没有什么⽤呀。
  在经过多次尝试后发现了⼀些东西,是我⾃⼰猜的,如果有什么不对的地⽅,请指正,谢谢。
  执⾏⼀个脚本时,会先开启⼀个⼦shell环境(不知道执⾏其它程序是不是这样),然后将⽗
shell中的所有系统环境变量复制过来,这个脚本中的语句就在⼦shell中执⾏。(也就是说⽗shell
的环境变量在⼦shell中可以调⽤,但反过来就不⾏,如果在⼦shell中定义了环境变量,只对该shell
或者它的⼦shell有效,当该⼦shell结束时,也可以理解为脚本执⾏完时,变量消失。)
为了证明这⼀点,请看脚本内容:
  test='value'
  export test
  这样的脚本执⾏完后,test实际上是不存在的。接着看下⾯的:
  test='value'
  export test
  bash
  这⾥在脚本最后⼀⾏再开⼀个⼦shell,该shell应该是脚本⽂件所在shell的⼦shell,这个脚本
执⾏完后,是可以看到test这个变量的,因为现在是处于它的⼦shell中,当⽤exit退出⼦shell后,
test变量消失。
  如果⽤source对脚本进⾏执⾏时,如果不加export,就不会在⼦shell中看到这个变量,
因为它还不是⼀个系统环境变量呀,如脚本内容是:
  test='value'
 ⽤source执⾏后,在shell下是能看到这个变量,但再执⾏bash开⼀个⼦shell时,test是不会
被复制到⼦shell中的,因为执⾏脚本⽂件其实也是在⼀个⼦shell中运⾏,所以我再建另⼀个脚本
⽂件执⾏时,是不会输⼊任何东西的,内容如:echo $test。所以这点特别注意了,明明在提⽰符
下可以⽤echo $test输出变量值,为什么把它放进脚本⽂件就不⾏了呢?
  所以得出的结论是:
1、执⾏脚本时是在⼀个⼦shell环境运⾏的,脚本执⾏完后该⼦shell⾃动退出;
2、⼀个shell中的系统环境变量会被复制到⼦shell中(⽤export定义的变量);
3、⼀个shell中的系统环境变量只对该shell或者它的⼦shell有效,该shell结束时变量消失
(并不能返回到⽗shell中)。
shell代码
3、不⽤export定义的变量只对该shell有效,对⼦shell也是⽆效的。
整理了⼀下贴⼦:为什么⼀个脚本直接执⾏和⽤source执⾏不⼀⾏呢?这也是我⾃⼰碰到的⼀个问题。manual原⽂是这样的:Read and execute commands from filename in the current shell environment and
return the exit status of the last command executed from filename.
明⽩了为什么不⼀样了吧?直接执⾏⼀个脚本⽂件是在⼀个⼦shell中运⾏的,⽽source则是在
当前shell环境中运⾏的。根据前⾯的内容,你也已经明⽩其中的道理了吧。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。