现在的位置: 首页 > 综合 > 正文

执行shell脚本的三种不同情况

2013年10月22日 ⁄ 综合 ⁄ 共 1575字 ⁄ 字号 评论关闭

shell 脚本执行是一个很有意思的事情,有三种不同的基本情况。这也是linux系统灵活性的一种体现。在我开始做LFS之前,我只会做一种shell脚本的执行 方式。那就是在当前目录下 ./shell-script.sh。哈哈,最近看了一些文章的解释之后,发现我真是太土了。

以前看过一些linux programming的书,知道fork的概念。fork是一种主要的linux创建子进程的方式。fork被调用之后,会创建一个子进程,该子进程继承了父进程的环境变量,但是它只是父进程的拷贝,它的修改并不会影响父进程的环境变量。

我最早会用的./shell-script.sh其实就是fork的方式去运行一个程序(这个程序就是shell脚本)。所以这个新的shell脚本在运行时拥有父进程的一个环境变量表的拷贝。所以我们知道了,这种默认的shell脚本执行是会创建出新的进程的。

而另外还有两种用法,是不会创建出子进程的,那就是source和exec。
和fork方式不同,source和exec则都会在当前的进程内去执行相应的程序。所以就不存在环境变量的拷贝问题,该shell脚本的执行直接会影响 到当前的环境变量表。而且exec还有个特别之处就是,当它执行的程序完成之后,所在的进程也会退出。比如在Gnome的terminal中用exec command之后,当前的terminal就会退出,这个有时候还很有用。source还有一个很有趣的缩写,也就是一个点。比如. ./shell-script.sh,是不是很奇怪。

总结一下

                      New Process            Terminate Current/Parent

-------------------------------------------------------

fork                   Y                                    N

source             N                                    N

exec                 N                                    Y

 

 

 

假设脚本为a.sh,则要运行该脚本,有以下方式

1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh, 如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可

2 sh/bash a.sh的路径,这种情况不需要脚本具有执行权限.

以上两种情况中,脚本中$0都是a.sh,都是在shell的子进程中运行的.

3 source a.sh的路径

4 . a.sh的路径

以上两种情况都是脚本在当前shell的进程中运行,所以$0都是bash/sh, 区别在于, source不是posix shell的内置命令,所以3在sh中实际上是不能运行的,在bash中可以. 而.则无论在bash还是posix shell中都是可以用来载入并执行脚本. 所以, 相对而言, 应该是4 更加具有移植性.

 

 

 

有个脚本内容如下:

#!/bin/sh

export aaa="bbb"

运行方法:

1, sh jiaoben.sh

2, ./jiaoben.sh

3, . jiaoben.sh

解释:

1, 操作系统启动程序sh, sh发现了一个参数jiaoben.sh,并把文件jiaoben.sh作为脚本执行.

2, 操作系统启动这个程序,然后发现是个脚本而不是二进制的程序,然后又发现这个脚本要用/bin/sh 执行(通过#!发现的),然后操作系统交给/bin/sh执行下面的命令行.

3, 在当前环境下执行脚本.所有的环境变量的修改都会在当前环境下生效,而1,2,脚本退出后,环境变量不变.

抱歉!评论已关闭.