zoukankan      html  css  js  c++  java
  • exec、source以及bash的区别(zz)

    在bash shell中,source、exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢?


    sh:父进程会fork一个子进程,shell script在子进程中执行


    source:在原进程中执行,不会fork子进程


    exec:在原进程中执行,但是同时会终止原进程


    注:使用export会把父进程中的变量向子进程中继承,但是反过来却不行,在子进程中,不管环境如果改变,均不会影响父进程

     

    下面用一个例子来讲解

    [plain] view plaincopy
     
    1. 1.sh  
    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"  
    [plain] view plaincopy
     
    1. 2.sh  
    2. CODE:  
    3. #!/bin/bash  
    4. echo "PID for 2.sh: $"  
    5. echo "2.sh get $A=$A from 1.sh"  
    6. A=C  
    7. export A  
    8. echo "2.sh: $A is $A"  

    下面在命令行中去执行

    ./1.sh fork

    可以看到,1.sh是在父进程中执行,2.sh是在子进程中执行的,父进程的PID是5344,而子进程的是5345,当子进程执行完毕后,控制权返回到父进程。同时,在子进程改变环境变量A的值不会影响到父进程。

    ./1.sh source

    由结果可知,1.sh和2.sh都是在同一进程中执行的,PID为5367

    ./1.sh exec

    可知,两个脚本都是在同一进程中执行,但是请注意,使用exec终止了原来的父进程,因此,可以看到

    [plain] view plaincopy
     
    1. echo "PID for 1.sh after exec/source/fork:$"  
    2. echo "1.sh: $A is $A"  

    这两个命令没有执行

    由这个例子,便大致可了解它们的区别了

  • 相关阅读:
    让SiteMapDataSource能选择特定的SiteMap文件
    程序员之路──如何学习C语言(转载)
    Sql Server 2005 Express使用命令工具无法连接问题
    移远公司 NBIoT模块AT指令详细解释
    Excel自动化技术
    解析HTTP报文头
    SOAP报文下发
    双缓冲队列,生产者消费者模式
    夸孩子少用“你真棒”,教你如何夸孩子
    C++面试题相关
  • 原文地址:https://www.cnblogs.com/frankly-frank/p/4052351.html
Copyright © 2011-2022 走看看