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

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

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

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

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

 

下面用一个例子来讲解

  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"
  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终止了原来的父进程,因此,可以看到

  1. echo "PID for 1.sh after exec/source/fork:$"
  2. echo "1.sh: \$A is $A"

这两个命令没有执行

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

exec、source以及bash的区别(zz)的更多相关文章

  1. shell 中exec、source以及bash的区别

    在bash shell中,source.exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢? sh:父进程会fork一个子进程,shell script在子进程中执行 so ...

  2. souce and bash 的区别

    对于一些环境变量的配置文件,如想使更改后立即生效,多用 souce +file 执行后即可.如/etc/profile 里加了配置, source 和  bash 的区别: source filena ...

  3. fork exec source的区别

    参考:http://www.cnblogs.com/bkygg/p/5023072.html 1:fork  运行的时候开一个sub_shell 执行调用的脚本,sub_shell执行的时候,pare ...

  4. shell中sh, exec, source, fork, ./的区别

    shell中sh, exec, source, fork, ./的区别 1,sh sh test.sh ​ sh是通过创建子进程(subshell)去执行脚本,父进程无法使用子进程中的变量,而子进程对 ...

  5. shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)

    fork ( /directory/script.sh) fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本. 运行的时候开一个sub- ...

  6. 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)——转载

    原文链接:http://blog.chinaunix.net/uid-22548820-id-3181798.html fork ( /directory/script.sh) :如果shell中包含 ...

  7. shell调用另一个脚本的三种方式fork/exec/source

    exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两 ...

  8. shell脚本头,#!/bin/sh与#!/bin/bash的区别.

    因为今天写了个小脚本,死活不成功,总是报文件或者目录不存在,问了一下我们马同学的正常写法,发现只有脚本头的区别,也就是今天本文要讲的#!/bin/sh与#!/bin/bash. 本文参考:https: ...

  9. 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考

    本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...

随机推荐

  1. VUE 入门基础(1)

    一,安装 Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能模拟的 ECMAScript 5 特性. Vue.js 支持所有兼容 ECMAScript 5 的浏览器. ...

  2. requirejs的使用

    requirejs的优点: 1.防止在js的加载过程中,阻止页面的渲染: 2.可以引入多个js文件: 3.可以写出重复使用的js模块: 4.有效的防止命名的冲突,通过将变量分装在模块中的方式实现: r ...

  3. 宏碁台式机,如何设置u盘启动

    1.按delete进入BIOS2.Authentication->Secure Boot状态改为Disabled;Boot Options->Launch CSM状态改为Always;Bo ...

  4. Sublime Text 3 配置Java开发

    Sublime Text 3 配置Java开发 内嵌模式 在Sublime内部输出面板显示执行过程 配置JavaC - INSET.sublime-build 打开Sublime的包目录(选择菜单:P ...

  5. Oracle数据库like和not like使用

    查询手机号注册的记录而不是邮箱 查询2开头的记录 select * from beyond_pay_offline where amount like '2%'

  6. 查看表的datapages

    select object_name(i.object_id) as tableName,data_pages as dataPagesfrom sys.indexes as ijoin sys.pa ...

  7. excel 把字符和数字分开

    主要是 len,lenb,left,right 函数 http://jingyan.baidu.com/article/95c9d20dac8540ec4f75616d.html

  8. UNIX:高级环境编程 - 第十五章 IPC:进程间通信

    IPC(InterProcess Communication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信. 1.管道 1.1管道特点: (1)半双工的(即数据只能在一个方 ...

  9. mybatis多表连接在一起查询

    实体类 和 xml (这里用了几个典型的数据类型,都是其他表的字段) private String marriage;//图片 remarks private Date createtime;//公告 ...

  10. 完整地mybatis + springmvc用checkbox实现批量删除

    因为自己在网上找了半天,都找不到完整地代码(脑袋笨,不会变通到自己项目里),所以在这里记下了近乎完整的代码 前端代码 <span style="cursor:pointer;" ...