shell十三问-6) exec 跟 source 差在哪

�@次先�我���� CU Shell 版的一����例�N子�碚�起吧:
(���改版後原�B�Y已�失效 )

例中的提��原文如下:
 

cd /etc/aa/bb/cc可以�绦�
但是把�@�l命令��入shell�rshell不�绦校�
�@是什么原因呀!


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

我���r如何回答��r�e去深究,先�我��了解一下行程(process)的�^念好了。
首先,我��所�绦械娜魏纬淌剑�都是由父行程(parent process)所�a生出�淼囊��子行程(child process),
子行程在�Y束後,�⒎祷氐礁感谐倘ァ4艘滑F像在 Linux 系�y中被�Q��  fork 。
(�楹我�程�� fork 呢?嗯,��一下�D或�S比�^好理解...  ^_^ )
��子行程被�a生的�r候,����母感谐棠茄e�@得一定的�Y源分配、及(更重要的是)�^承父行程的�h境�u
�我��回到上一章所�到的"�h境�量"吧:
* 所�^�h境�量其��就是那些���鹘o子行程的�量。
��味�言,"�z�餍�"就是�^分本地�量�c�h境�量的�Q定性指�恕�
然而,�倪z�鞯慕嵌�砜矗�我��也不�y�l�F�h境�量的另一��重要特徵:
* �h境�量只能�母感谐痰阶有谐�蜗蚶^承。�Q句��f:在子行程中的�h境如何�更,均不��影�父行程的�h境。

接下�恚�再�我��了解一下命令�_本(shell script)的概念。
所�^的 shell script �v起�砗芎��危�就是�⒛闫�r在 shell prompt 後所�入的多行 command line 依序��入一��文件去而已。
其中再加上一些�l件判�唷⒒�咏缑妗��颠\用、函�嫡{用等等技巧,得以� script 更加"�明"的�绦校�
但若撇�_�@些技巧不�,我��真的可以��蔚目闯� script 只不�^依次�绦蓄A先��好的命令行而已。

再�Y合以上���概念(process + script),那���就不�y理解如下�@句�的意思了:
* 正常�碚f,��我���绦幸�� shell script �r,其��是先�a生一�� sub-shell 的子行程,然後 sub-shell 再去�a生命令行的子行程。
然�t,那�我��回到本章�_始�r所提到的例子再�男滤伎迹�
 

cd /etc/aa/bb/cc可以�绦�
但是把�@�l命令��入shell�rshell不�绦校�
�@是什么原因呀!



我���r的答案是�@�拥模�
 

因�椋�一般我��跑的 shell script 是用 subshell 去�绦械摹�
�� process 的�^念�砜矗�是 parent process �a生一�� child process 去�绦校�
�� child �Y束後,��返回 parent ,但 parent 的�h境是不��因 child 的改�而改�的。
所�^的�h境元�岛芏啵�凡�e effective id, variable, workding dir 等等...
其中的 workding dir ($PWD) 正是�侵鞯囊��所在:
��用 subshell �砼� script 的�,sub shell 的 $PWD ��因�� cd 而�更,
但��返回 primary shell �r,$PWD 是不���更的。



能�蛄私���}的原因及其原理是很好的,但是?如何解�Q���}恐怕是我��更感�d趣的�u是吧?^_^
那好,接下�恚�再�我��了解一下 source 命令好了。
��你有了 fork 的概念之後,要理解 source 就不�y:
* 所�^ source 就是� script 在��前 shell ��绦小⒍�不是�a生一�� sub-shell ��绦小�
由於所有�绦薪Y果均於��前 shell �韧瓿桑�若 script 的�h境有所改�,��然也��改���前�h境了�u
因此,只要我���⒃�本�为��入的 script 命令行�成 source 命令的��担�就可�p易解�Q前例提到的���}了。
比方�f,原本我��是如此�绦�  script 的:
 

  1. ./my.script
复制代码


�F在改成�@�蛹纯桑�
 

  1. source ./my.script
     
  2. 或:
     
  3. . ./my.script
复制代码



�f到�@�e,我想,各位有�d趣看看 /etc 底下的�多�O定文件,
���不�y理解它��被定�h後,如何�其他 script �x取�K�^承了吧?
若然,日後你有�C����自己的 script ,��也不�y�iT指定一���O定文件以供不同的 script 一起"共用"了...  ^_^

okay,到�@�e,若你搞得懂 fork �c source 的不同,那接下�碓俳邮芤��挑�穑�
---- 那 exec 又�c source/fork 有何不同呢?
哦... 要了解 exec 或�S�^�檠}�s,尤其扯上 File Descriptor 的�...
不�^,���碚f:
* exec 也是� script 在同一��行程上�绦校�但是原有行程�t被�Y束了。
也就是�而言之:原有行程��否�K止,就是 exec �c source/fork 的最大差��了。

嗯,光是�睦碚�去理解,或�S�]那�N好消化,不如�邮�"��作+思考"�淼挠∠笊羁膛丁�
下面�我���������蔚� script ,分�e命名�� 1.sh 及 2.sh :

1.sh
 


  1.  
  2. #!/bin/bash
     
  3. A=B
     
  4. echo "PID for 1.sh before exec/source/fork:$$"
     
  5. export A
     
  6. echo "1.sh: \$A is $A"
     
  7. case $1 in
     
  8.         exec)
     
  9.                 echo "using exec..."
     
  10.                 exec ./2.sh ;;
     
  11.         source)
     
  12.                 echo "using source..."
     
  13.                 . ./2.sh ;;
     
  14.         *)
     
  15.                 echo "using fork by default..."
     
  16.                 ./2.sh ;;
     
  17. esac
     
  18. echo "PID for 1.sh after exec/source/fork:$$"
     
  19. echo "1.sh: \$A is $A"
复制代码



2.sh
 

  1. #!/bin/bash
     
  2. echo "PID for 2.sh: $$"
     
  3. echo "2.sh get \$A=$A from 1.sh"
     
  4. A=C
     
  5. export A
     
  6. echo "2.sh: \$A is $A"
复制代码



然後,分�e跑如下���碛^察�Y果:
 

  1. $ ./1.sh fork
     
  2. $ ./1.sh source
     
  3. $ ./1.sh exec
复制代码



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

好了,�e忘了仔�比�^�出�Y果的不同及背後的原因哦...
若有疑��,�g迎提出�硪黄鹩����~~~

happy scripting! ^_^
 

你可能感兴趣的:(shell,十三问)