Linux系统中bash shell编程的10个基础问题讲解

2019-09-23 09:20:30王振洲

能够了解问题的原因及其原理是很好的,但是?如何解决问题恐怕是我们更感兴趣的﹗是吧?^_^

那好,接下来,再让我们了解一下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)那样…