能够了解问题的原因及其原理是很好的,但是?如何解决问题恐怕是我们更感兴趣的﹗是吧?^_^
那好,接下来,再让我们了解一下source命令好了。当你有了fork的概念之后,要理解source就不难:
所谓source就是让script在当前shell内执行、而不是产生一个sub-shell来执行。
由于所有执行结果均于当前shell内完成,若script的环境有所改变,当然也会改变当前环境了﹗因此,只要我们将原本单独输入的script命令行变成source命令的参数,就可轻易解决前例提到的问题了。
比方说,原本我们是如此执行script的:
./my.script
现在改成这样即可:
source ./my.script
或:
../my.script
说到这里,我想,各位有兴趣看看/etc底下的众多设定文件,应该不难理解它们被定义后,如何让其他script读取并继承了吧?若然,日后你有机会写自己的script,应也不难专门指定一个设定文件以供不同的script一起“共享”了…^_^
okay,到这里,若你搞得懂fork与source的不同,那接下来再接受一个挑战:
那exec又与source/fork有何不同呢?
哦…要了解exec或许较为复杂,尤其扯上File Descriptor的话…不过,简单来说:
exec也是让script在同一个行程上执行,但是原有行程则被结束了。也就是简而言之:原有行程会否终止,就是exec与source/fork的最大差异了。
嗯,光是从理论去理解,或许没那么好消化,不如动手“实作+思考”来的印象深刻哦。下面让我们写两个简单的script,分别命名为1.sh及2.sh:
1.sh
#!/bin/bash A=B echo "PID for 1.sh before exec/source/fork:$$" export A echo "1.sh: $A is $A" case $1 in exec) echo "using exec…" exec ./2.sh;; source) echo "using source…" ../2.sh;; *) echo "using fork by default…" ./2.sh;; esac echo "PID for 1.sh after exec/source/fork:$$" echo "1.sh: $A is $A"
2.sh
#!/bin/bash echo "PID for 2.sh: $$" echo "2.sh get $A=$A from 1.sh" A=C export A echo "2.sh: $A is $A"
然后,分别跑如下参数来观察结果:
$ ./1.sh fork $ ./1.sh source $ ./1.sh exec
好了,别忘了仔细比较输出结果的不同及背后的原因哦…若有疑问,欢迎提出来一起讨论讨论~~~happy scripting!^_^
第7问:( ) 與 { } 差在哪?
嗯,这次轻松一下,不讲太多…^_^
先说一下,为何要用()或{ }好了。许多时候,我们在shell操作上,需要在一定条件下一次执行多个命令,也就是说,要么不执行,要么就全执行,而不是每次依序的判断是否要执行下一个命令。或是,需要从一些命令执行优先次顺中得到豁免,如算术的2*(3+4)那样…










