问题:
有很多方式可以执行脚本,
1)。source test.bsh
2)。. test.bsh
3)。chmod a+x test.bsh;./test.bsh
4)。sh test.bsh
它们之间的差别是什么?
解决办法:
1. source命令的作用是读取并执行test.bsh中的命令;
该命令经常用点命令“.”来替代。
就是说,
# source test.bsh
与
# . test.bsh
的作用完全相同。
2. 用脚本文件名本身执行(如果shell脚本具有可执行权限)和用sh命令执行脚本的作用完全相同。
3. 用source命令执行脚本文件和用sh执行脚本文件的区别:
用source执行脚本文件,执行过程不另开进程,脚本文件中设定的变量在当前shell中可以看到;
用sh执行脚本文件,是在当前进程另开子进程来执行脚本命令,脚本文件中设定的变量在当前shell中不能看到。
比如:
test.bsh的内容如下:
#!/bin/bash
echo $$
tstvar=12345
以下是上面四种不同方式执行结果的差异:
dingq@wd-u1110:~/wrk/tmp$ echo $$
2375
dingq@wd-u1110:~/wrk/tmp$ unset tstvar;source tst_sh.bsh;echo $tstvar
2375
12345
dingq@wd-u1110:~/wrk/tmp$ unset tstvar;. tst_sh.bsh;echo $tstvar
2375
12345
dingq@wd-u1110:~/wrk/tmp$ unset tstvar;./tst_sh.bsh;echo $tstvar
5960
dingq@wd-u1110:~/wrk/tmp$ unset tstvar;sh tst_sh.bsh;echo $tst_var
5966
dingq@wd-u1110:~/wrk/tmp$
可以看到,当前进程ID为2375,用source和点命令(.)执行脚本时不改变当前进程,并且脚本中的变量可以看到;
而直接执行脚本文件和使用sh执行脚本时改变了当前进程,并且脚本中的变量不能看到;
问题解决。