脚本执行

解释器的区别

脚本常用的开头是“#!解释器”,其中“#!”是特殊的表示符,其后面跟着的是解释此脚本的解释器路径。

解释器分为很多类。比如/bin/bash,/bin/sh,/bin/csh,/bin/perl,/bin/awk等等。

GNU/Linux操作系统中的bin/sh本是bash的符号链接,但是bash过于复杂,所以有人有把NetBSD的ash移植到了Linux并更名为dash,并建议将bin/sh指向它,以获得更快的执行速度。且Dash Shell比 Bash Shell要小很多,且符合POSIX标准。

Ubuntu继承了Debian,所以从Ubuntu 6.10开始默认是Dash Shell。

脚本执行

综上,在Ubuntun中有2个解释器,一个是较重的bin/bash,另外一个是轻量级的bin/sh,且它指向ash,而ash本身是从其它操作系统中移植过来的。

而/bin/sh/bin/bash虽然大体上没什么区别,但仍存在不同的标准。标记为#!/bin/sh的脚本不应使用任何POSIX没有规定的特性 (如let等命令, 但#!/bin/bash可以)。

执行命令的区别

执行脚本有多种方式:

方式一:source命令,sourcetest.sh;

方式二:点命令,. test.sh;[注意点与文件名之前有空格]

方式三:指定脚本执行器,shtest.sh;

方式四:点杠命令,./test.sh

source命令与点命令的作用是完全相同的。

而指定脚本执行器与点杠命令作用完全相同。

但是source与指定脚本执行器执行的区别在于,前者会在当前进程生效,所以脚本中改变的环境变量,会在当前的bash中生效,而后者会新生成一个子进程执行,所以当前进程并不会有任何改变,如下图所示。

脚本执行

脚本执行

举例

测试脚本如下

#!/bin/bash

echo $$

tstvar=12345

执行结果如下

脚本执行

参考

[0] http://www.cnblogs.com/EasonJim/p/6850319.html

[1] http://blog.****.net/david_xtd/article/details/8012627