读书人

exec 和 source 差在哪

发布时间: 2012-09-06 10:37:01 作者: rapoo

exec 跟 source 差在哪?
次先我 CU Shell 版的一例子起吧:
(改版後原已失效 )

例中的提原文如下:
cd /etc/aa/bb/cc可以行
但是把命令入shellshell不行!
是什么原因呀!

(意思是:行本後并有移到 /etc/aa/bb/cc 目)

我如何回答去深究,先我了解一下行程(process)的念好了。
首先,我所行的任何程式,都是由父行程(parent process)所生出的一子行程(child process),
子行程在束後,返回到父行程去。此一像在 Linux 系中被 fork 。
(何要程 fork 呢?嗯,一下或比好理解... ^_^ )
子行程被生的候,父行程那得一定的源分配、及(更重要的是)承父行程的境
我回到上一章所到的"境量"吧:
* 所境量其就是那些子行程的量。
而言,"性"就是分本地量境量的定性指。
然而,的角度看,我也不境量的另一重要特徵:
* 境量只能父行程到子行程向承。句:在子行程中的境如何更,均不影父行程的境。

接下,再我了解一下命令本(shell script)的概念。
所的 shell script 起很,就是你平在 shell prompt 後所入的多行 command line 依序入一文件去而已。
其中再加上一些件判、互界面、用、函用等等技巧,得以 script 更加"明"的行,
但若撇些技巧不,我真的可以的看成 script 只不依次行先好的命令行而已。

再合以上概念(process + script),那就不理解如下句的意思了:
* 正常,我行一 shell script ,其是先生一 sub-shell 的子行程,然後 sub-shell 再去生命令行的子行程。
然,那我回到本章始所提到的例子再新思考:
cd /etc/aa/bb/cc可以行
但是把命令入shellshell不行!
是什么原因呀!


我的答案是的:
因,一般我跑的 shell script 是用 subshell 去行的。
process 的念看,是 parent process 生一 child process 去行,
child 束後,返回 parent ,但 parent 的境是不因 child 的改而改的。
所的境元很多,凡 effective id, variable, workding dir 等等...
其中的 workding dir ($PWD) 正是主的疑所在:
用 subshell 跑 script 的,sub shell 的 $PWD 因 cd 而更,
但返回 primary shell ,$PWD 是不更的。


能了解的原因及其原理是很好的,但是?如何解恐怕是我更感趣的是吧?^_^
那好,接下,再我了解一下 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
复制代码


或是,你也可以考 CU 上的另一子:
http://www.chinaunix.net/forum/viewtopic.php?t=191051

好了,忘了仔比出果的不同及背後的原因哦...
若有疑,迎提出一起~~~

读书人网 >编程

热点推荐