脚本执行
解释器的区别
脚本常用的开头是“#!解释器”,其中“#!”是特殊的表示符,其后面跟着的是解释此脚本的解释器路径。
解释器分为很多类。比如/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