fork   使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child   process 去执行该 script, 当 child process 结束后, 会返回 parent process,   但 parent process 的环境是不会因 child process 的改变而改变的. source   使用 source 方式运行 script 时, 就是让 script 在当前 process 内执行, 而不   是产生一个 child process 来执行. 由于所有执行结果均于当前 process 内完成,   若 script 的环境有所改变, 当然也会改变当前 process 环境了. exec   使用 exec 方式运行script时, 它和 source 一样, 也是让 script 在当前process   内执行, 但是 process 内的原代码剩下部分将被终止. 同样, process 内的环境随   script 改变而改变.

结论:通常如果我们执行时,都是默认为fork的。大家可以通过pstree命令看看关于父子进程的关系。如上,如果想让父进程得到子进程的环境变量,就是source方式了 
     * fork ( /directory/script.sh)
     fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.
     运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。
     sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell
     *
      exec (exec /directory/script.sh)
     exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别
     *
      source (source /directory/script.sh)
     与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.

可以通过下面这两个脚本来体会三种调用方式的不同:
1.sh 
     #!/bin/bash
     A=B
    echo &quot ID 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 &quot ID for 1.sh after exec/source/fork $"
    echo "1.sh: \$A is $A"
2.sh 
     #!/bin/bash
     echo &quot ID for 2.sh: $$"
    echo "2.sh get \$A=$A from 1.sh"
    A=C
    export A
    echo "2.sh: \$A is $A"
      
      
     执行情况:
     $ ./1.sh 
    PID for 1.sh before exec/source/fork:5845364
    1.sh: $A is B
    using fork by default…
    PID for 2.sh: 5242940
    2.sh get $A=B from 1.sh
    2.sh: $A is C
    PID for 1.sh after exec/source/fork:5845364
    1.sh: $A is B
    $ ./1.sh exec
    PID for 1.sh before exec/source/fork:5562668
    1.sh: $A is B
    using exec…
    PID for 2.sh: 5562668
    2.sh get $A=B from 1.sh
    2.sh: $A is C
    $ ./1.sh source
    PID for 1.sh before exec/source/fork:5156894
    1.sh: $A is B
    using source…
    PID for 2.sh: 5156894
    2.sh get $A=B from 1.sh
    2.sh: $A is C
    PID for 1.sh after exec/source/fork:5156894
    1.sh: $A is C
    $

fork source exec区别差异相关推荐

  1. linux中fork, source和exec的区别

    shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现的,如awk,sed. source和exec都是内部命令 ...

  2. c++中的fork函数_linux c语言 fork() 和 exec 函数的简介和用法

    linux c语言 fork() 和 exec 函数的简介和用法 假如我们在编写1个c程序时想调用1个shell脚本或者执行1段 bash shell命令, 应该如何实现呢? 其实在<stdli ...

  3. 进程fork和exec ---Unix网络编程笔记

    进程fork和exec ---Unix网络编程笔记 fork 一次调用,两次返回 fork的两个典型用法 最简单的并发服务器---fork子进程 exec -Unix网络编程笔记) fork #inc ...

  4. linux c语言 fork() 和 exec 函数的简介和用法

    假如我们在编写1个c程序时想调用1个shell脚本或者执行1段 bash shell命令, 应该如何实现呢? 其实在<stdlib.h> 这个头文件中包含了1个调用shell命令或者脚本的 ...

  5. python中exec是什么意思_Python中的进程分支fork和exec详解

    在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. 1.fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独 ...

  6. 三文鱼肉质和虹鳟鱼肉质有什么区别差异

    三文鱼是世界上最热销的一种水产食材,但很多人都听说市场上出售的三文鱼多是用虹鳟鱼假冒而成的,于是人们就特别想知道,虹鳟鱼和三文鱼之间有什么关系,想知道它们之间有什么不同?今天就对虹鳟鱼和三文鱼之间的区 ...

  7. 什么是CTG线路?和CN2线路有什么区别差异?

    什么是CTG线路?和CN2线路有什么区别差异? 什么是CTG线路? Ctgnet(as23764)是中国电信全球有限公司(CTG)新建的国际多业务承载网.为企业客户提供定制的国际互联网专线接入服务(G ...

  8. “Import from external model” 与 “Create from existing source”的区别

    "Import from external model" 与 "Create from existing source"的区别 学习java一段时间,最近想捣鼓 ...

  9. fork join、fork join_any、fork join_none的区别

    在Verilog中我们对线程(即独立运行的程序,分为父线程和子线程)的使用有: 1.begin--end块 (顺序执行) 2.fork----join块 (并行执行) 而在SV中又增加了两种新的创建线 ...

最新文章

  1. LPSTR, LPCSTR ,LPTSTR,LPCSTR,LPWSTR LPCWSTR
  2. 专家支招:手把手教你如何选型移动CRM
  3. 爱之箭发射(las)
  4. ThinkPHP 模型方法 setInc() 和 setDec()
  5. bzoj4152 The Captain (dijkstra)
  6. ProtoBuff3.0.0在Ubuntu上安装
  7. 3-4HDFS的特点
  8. linux: chmod,chown命令详解
  9. shell 基础知识
  10. weblogic-开发模式转变为生产模式生产模式转变为开发模式
  11. 28留数及其应用(四)
  12. 蒋涛:《Orange’S:一个操作系统的实现》属于真正Hacker的
  13. 微信小程序 JavaScript(JS)字符串转gbk(无需下载,无需积分)
  14. CDA Level1复盘总结
  15. GRBL分析:gcode解释器(二)
  16. Vue+element搭建后台管理系统-二、安装插件
  17. CCNet: Criss-Cross Attention for Semantic Segmentation阅读笔记
  18. FlashFXP 便携版,U盘版,真正绿色
  19. 【Java学习002】Java-ArrayList源码解析
  20. 公众号欢迎各位大佬投稿

热门文章

  1. 用python turtle库画正方形_用Python Turtle画一个正方形
  2. oracle创建数据库用户并授权,oracle创建数据库、表空间、用户并授权
  3. [渝粤教育] 西南政法大学 法理学 参考 资料
  4. 【渝粤教育】21秋期末考试成本会计10168k2
  5. [渝粤教育] 中国地质大学 高级会计学 复习题
  6. [渝粤教育] 中国地质大学 马克思主义基本原理 复习题
  7. 【渝粤教育】电大中专公共基础课程_1作业 题库
  8. 【渝粤题库】国家开放大学2021春3979会计学概论题目
  9. 无线传感器主要应用领域及发展趋势
  10. c++冒泡排序代码_【开源推荐】数据结构和算法必知必会的50个代码实现