• 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"  

    这两个命令没有执行

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

  • 相关阅读:
    _getch()函数的一些使用方法
    键盘敲击(keyboard hit)
    计时 GetTickCount() 函数的作用和用法
    1
    关于COLORREF的定义及用法
    C++字符串大小写转换的库函数
    数楼梯(斐波那契数列+高精度)
    回文数(内含高精度加法,字符串是否为回文的判断)
    最短路径Dijkstra算法
    经典八大排序
  • 原文地址:https://www.cnblogs.com/frankly-frank/p/4052351.html
Copyright © 2020-2023  润新知