linux shell 结构 与source 命令
Linux Shell&环境变量
登录到系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行 shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创 建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。
在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了 一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,它的子shell不能引用它,要使某个变量的值可以在它的子shell中被 改变,可以使用export命令对已定义的变量进行输出。export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了 一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,它的子shell不能引用它,要使某个变量的值可以在它的子shell中被 改变,可以使用export命令对已定义的变量进行输出。export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
例子
编写一个C程序,这个C程序需要动态链接一个用户编写的动态库。一切编译好之后,运行可执行文件,会发现系统提示无法找到动态链接库。好的,你发现原来没有将这个动态库的路径加入到LD_LIBRARY_PATH中。但是,加好之后,系统仍然提示无法找到动态库。这是什么缘故呢?当用export LD_LIBRARY_PATH命令后,再运行可执行文件,成功了!由此推测,linux shell在运行可执行程序的时候,也会产生一个子shell。
Source命令
source命令执行一个脚本时,不会产生一个子shell,而是在当前的shell环境中运行。比如您在一个脚本里export $KKK=111 ,假如您用./a.sh执行该脚本,执行完毕后,您运行 echo $KKK ,发现没有值,假如您用source来执行 ,然后再echo ,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结构并没有反应到父shell里,但是 source不同他就是在本shell中执行的,所以能够看到结果。