2014年5月26日星期一

Linux_060:shell 脚本的执行方式

执行一个脚本时,我们一般用source filename或者 . ./filename(第1个.和第2个.之间有个空格)。

相同点:
(1)使用这两种方式时,脚本不必是可执行的。
(2)这两种方式都是在当前shell中执行脚本。即source命令和.命令其实都只是简单地读取脚本里面的语句,然后依次在当前shell里面执行,并没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

那么,在当前shell中执行和在子shell中执行的区别是什么呢?
在子shell中定义的变量和函数在执行结束后就消失了,而在当前shell中的定义的变量和函数在执行结束后可以保留下来。

不同点:
(1)使用source命令时,filename不必包含“./”,是因为souce命令会从PATH环境变量中找filename,如果在PATH中找不到,再从当前目录下找。
(2)使用.命令时,filename必须包含“./”,是因为.命令只从PATH环境变量中找filename,因为当前目录不在PATH环境中,所以必须加上“./”。

如果脚本是可执行的,那么直接运行./filename会怎么样呢?
(1)当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别的。
(2)sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。

举例说明:
(1)新建一个test.sh脚本,内容为:A=1
(2)然后使其可执行chmod +x test.sh。
(3)运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell。
(4)运行./test.sh后,也是一样的效果。
(5)运行source test.sh 或者 . test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell中。

参考文献:
1. http://blog.csdn.net/mci2004/article/details/7182829
2. http://codingstandards.iteye.com/blog/837935
3. http://blog.chinaunix.net/uid-10435474-id-2957055.html
4. http://www.51testing.com/html/38/225738-206878.html

没有评论: