参考:《linux命令、编辑器与shell编程》 《unix环境高级编程》

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

bash shell的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。

  在说明exe和source的区别之前,先说明一下fork的概念。

  fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。

环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。 

shell script:

有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不再启用其他shell。

新产生一个shell然后再执行scripts的方法是在scripts文件开头加入以下语句

#!/bin/sh

一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。

另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。

source:

source命令即点(.)命令。

在bash下输入man source,找到source命令解释处,可以看到解释”Read and execute commands from filename in the current shell environment and …”。从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。

exec:

在bash下输入man exec,找到exec命令解释处,可以看到有”No new process is created.”这样的解释,这就是说exec命令不产生新的子进程。那么exec与source的区别是什么呢?

exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。

  1. 系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。

一个进程主要包括以下几个方面的内容:

(1)一个可以执行的程序

(2) 与进程相关联的全部数据(包括变量,内存,缓冲区)

(3)程序上下文(程序计数器PC,保存程序执行的位置)

  1. exec是一个函数簇,由6个函数组成,分别是以excl和execv打头的。

执行exec系统调用,一般都是这样,用fork()函数新建立一个进程,然后让进程去执行exec调用。我们知道,在fork()建立新进程之后,父进各与子进程共享代码段,但数据空间是分开的,但父进程会把自己数据空间的内容copy到子进程中去,还有上下文也会copy到子进程中去。而为了提高效率,采用一种写时copy的策略,即创建子进程的时候,并不copy父进程的地址空间,父子进程拥有共同的地址空间,只有当子进程需要写入数据时(如向缓冲区写入数据),这时候会复制地址空间,复制缓冲区到子进程中去。从而父子进程拥有独立的地址空间。而对于fork()之后执行exec后,这种策略能够很好的提高效率,如果一开始就copy,那么exec之后,子进程的数据会被放弃,被新的进程所代替。

  1. exec与system的区别

(1) exec是直接用新的进程去代替原来的程序运行,运行完毕之后不回到原先的程序中去。

(2) system是调用shell执行你的命令,system=fork+exec+waitpid,执行完毕之后,回到原先的程序中去。继续执行下面的部分。

总之,如果你用exec调用,首先应该fork一个新的进程,然后exec. 而system不需要你fork新进程,已经封装好了。

本文转自 wangergui 51CTO博客,原文链接:http://blog.51cto.com/wangergui/2070870,如需转载请自行联系原作者

shell中exec解析相关推荐

  1. Linux 下shell中exec解析

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

  2. linux shell中的命令自动补全(compgen complete)与 命令行参数解析

    linux shell中的命令自动补全(compgen complete)与 命令行参数解析 标签: shell脚本 2013-12-31 21:56 6661人阅读 评论(6) 收藏 举报 分类: ...

  3. linux的compgen命令,linux shell中的命令自动补全(compgen complete)与 命令行参数解析...

    很多时候,当我们写一个脚本时,我们总会提供一些可选的命令选项.当可选项比较多的时候,比如git, 如果能够提供命令自动补全,无疑是锦上添花的事.而且个人认为,这种方式,比采用将命令做成选择菜单要更好一 ...

  4. shell和php区别,PHP中exec函数和shell_exec函数的区别

    这篇文章主要介绍了PHP中exec函数和shell_exec函数的区别,这两个函数是非常危险的函数,一般情况都是被禁用的,当然特殊情况下也会使用,需要的朋友可以参考下 这两个函数都是执行Linux命令 ...

  5. macos终端美化_关于macOS终端美化的最轻松的指南Z Shell中的速成课程

    macos终端美化 Speeding it up more than the standard bash terminal that comes with your MacOS by using iT ...

  6. 【OS xv6】1 万字详解shell源码解析命令(内含wsl+vscode调试xv6教程 文档第一章助读)

    现在前面的 嘻嘻几百年没写文了确实没时间,等搞完毕设可以一起重温重温.最近学os,读源码发现还挺多东西得整理的,尤其途中有必要找资料整理的时候,内容有点多有点乱,写在源码已经显得不现实了.用的vsco ...

  7. Linux从mysql中读取数据_linux shell中读写操作mysql数据库

    本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...

  8. shell中竖线的作用_如何在 Linux 中安装、配置和使用 Fish Shell?

    每个 Linux 管理员都可能听到过 shell 这个词.你知道什么是 shell 吗? 你知道 shell 在 Linux 中的作用是什么吗? Linux 中有多少个 shell 可用? -- Ma ...

  9. shell 中| || () {} 用法以及shell的逻辑与或非

    && 运算符: 格式 command1 && command2 &&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令 ...

最新文章

  1. wamp配置虚拟域名
  2. mysql 语句除法_SQL的查询语句(除法)
  3. html5绘制随机五角星_html5 canvas画五角星(随机生成)
  4. Windows开启WMI时一些总结
  5. 【NetApp】安装Cmode模拟器时,应使用带交换机的模式
  6. windows下,C++实现串口编程,串间口转发数据
  7. shell 如何避免误删目录
  8. 基于.net载发软件的下拉框(ComBox)无法显示数据问题
  9. mysql 忘记密码, 亲测有效解决方案,Access denied for user ‘root’@’localhost’ (using password: YES)...
  10. 利用drozer进行Android渗透测试
  11. 菜鸟评python,F#,Go
  12. 如何区分oracle服务器、oracle客户端、plsql?
  13. 薪水太低的你,为什么不跳槽?
  14. 销售订单的 状态 变更
  15. 撩课-Java面试宝典-第十六篇
  16. 计算机重置指令,如何利用指令重置Win7网络设置
  17. 国内第一本Julia语言书籍《Julia语言程序设计》出版了!
  18. switch:欢迎进入迷你游戏平台,选择你喜爱的游戏
  19. 无根树任意根深度加强版
  20. Linux平台下rar, 7z, zip压缩文件密码破解

热门文章

  1. lego training
  2. 关于lucene的书
  3. 微服务测试之静态代码扫描
  4. Python之基础知识
  5. Nginx+FastCGI运行原理
  6. mysql 协议的ResultsetRow包及解析
  7. python学习随笔--web框架
  8. fedora22 无法联网的情况下rpm安装gcc5.1
  9. JAVA SAX解析XML字符串实例
  10. Stream Part.4