0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么shell脚本中执行命令要加exec?这个exec有什么作用呢?

dyquk4xk2p3d 来源:ytcoode 2023-08-21 09:10 次阅读

0x01 示例

正常情况下,如果我们想要在shell脚本中执行一个命令,我们只用将该命令原样写到这个shell脚本中就好了。

但有时候我们会发现,在一些shell脚本中,在某个命令之前,会有一个exec,比如下图所示:

556cab1a-3fb2-11ee-ac96-dac502259ad0.png

上图中,我们要在shell脚本中执行一个sleep命令,但在该命令之前,我们加了个exec,那这个exec有什么作用呢?

0x02 exec的作用

我们先看下exec对应的文档,看看官方是如何解释的。

因为exec是bash的一个内置命令,所以我们可以在bash中,用help命令,查询exec对应的文档。

55944d82-3fb2-11ee-ac96-dac502259ad0.png

上图文档的大致意思为,将shell替换为exec指定的命令,这个解释比较模糊,我们做几个实验具体看下。

0x03 实验

还是使用上面的那个脚本,不过我们先把exec去掉,然后执行。

在该脚本执行后,我们用ps命令查看和该脚本相关的进程树:

55b495e2-3fb2-11ee-ac96-dac502259ad0.png

由上图可见,我们先在bash中执行了a.sh这个测试脚本,然后又在a.sh脚本中,执行了sleep命令。

该执行结果产生了上图中的进程树,即sleep进程的父进程为a.sh进程,a.sh进程的父进程为bash进程。

我们再把exec加回来,然后再执行该脚本,该次执行后,和a.sh脚本相关的进程树为:

55d6178a-3fb2-11ee-ac96-dac502259ad0.png

看上图中,这次没有了a.sh进程,为什么呢?因为它被sleep程序替换掉了。

这就是exec的用的,它会告诉linux内核,直接在当前shell脚本进程中,加载并执行目标程序。

这一过程会覆盖掉原shell脚本进程中的各种代码和数据信息,使得原shell脚本进程立即停止运行,并转向执行目标程序代码。

exec命令本质上是执行了execve系统调用,如果想要了解该命令的具体细节,可以查看execve的man文档。

0x04 注意事项

因为exec会立即抹掉当前shell脚本进程中的各种数据,然后加载并执行目标程序代码,所以在exec命令之后,除了错误检查逻辑外,不应该再有其他逻辑,因为这些逻辑永远都不会被执行了。

看个例子:

568ae854-3fb2-11ee-ac96-dac502259ad0.png

看上图中,只输出了hello,并没有输出world,因为echo world命令写在了exec echo hello命令之后,它是不会被执行的。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389
  • Shell
    +关注

    关注

    1

    文章

    358

    浏览量

    22902

原文标题:为什么shell脚本中执行命令要加exec

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux中执行shell脚本的两种方式

    一条的执行很是不大方便,这种太多命令的才能完成的,一般都是编写一个shell脚本来进行操作,而不用一步一步的进行。有些时候在Linux中的很多对应的应用程序目录下有很多.sh结尾的
    发表于 11-18 16:49 1391次阅读
    Linux中<b class='flag-5'>执行</b><b class='flag-5'>shell</b><b class='flag-5'>脚本</b>的两种方式

    关于system exec.vi的问题

    我在顺序结构,用system exec.vi打开程序之后不能进行下一帧,关闭程序才可继续。也就跟没打开一样。这个是vi本身的问题,还是
    发表于 11-28 23:08

    【Linux学习杂谈】之exec族函数

    。小技巧:which + 命令,可以查看命令所在的全路径假设我们执行ls -a -l这个命令
    发表于 09-08 13:14

    labview执行系统命令函数system exec.vi的使用

    网上关于labview执行系统命令函数system exec.vi的使用有些少。好几次要用它,都要花好长时间去找资源研究怎么使用。想在这里再问一下,关于
    发表于 01-21 09:32

    Shell脚本编程笔记(二)

    本帖最后由 iysheng 于 2017-2-26 11:18 编辑 exec命令总结:脚本调试参数总结:字符串比较:shell数值比较:sh
    发表于 02-26 11:15

    [转]find命令结合exec和xargs使用的区别

    本文转自:老男孩教育官网转载请注明出处:https://www.oldboyedu.com/zuixin_wenzhang/index/id/269.htmlfind命令结合exec和xargs
    发表于 09-03 15:26

    shell脚本最简明的教程

    Shell脚本,就是利用Shell命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说
    的头像 发表于 10-16 11:27 4356次阅读
    <b class='flag-5'>shell</b><b class='flag-5'>脚本</b>最简明的教程

    如何创建和执行一个简单的Linux shell脚本

     如果您愿意要尝试更长的shell脚本,请将下面的shell脚本(并附加为PDF和ODT文件)复制到文本编辑器中,保存,使其可执行并运行。当
    的头像 发表于 11-06 17:28 1.3w次阅读

    109个实用shell脚本分享

    Shell脚本,就是利用Shell命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说
    的头像 发表于 03-16 08:58 2261次阅读

    find exec命令实例教程

    Linux find命令是根据指定条件搜索文件和目录的绝佳工具。exec允许您对找到的文件执行指定操作。
    的头像 发表于 12-06 17:08 1905次阅读

    通过一个脚本搞懂fork、source和exec

    Source模式下,子shell执行时获取的环境变量会会影响到父shell。与fork的区别在于,不会额外打开一个sub-shell执行
    的头像 发表于 02-03 16:05 1130次阅读

    Qt中的三个exec之间有什么联系

    在Qt中,常见到三个exec,第一个是QApplication::exec(),第二个是QEventLoop::exec,第三个是QThread::exec()。本文从源码角度来看看这
    的头像 发表于 03-06 09:44 1229次阅读

    shell脚本基本命令

    Shell脚本是一种可执行文件,它包含了一组用某种特定语言编写的命令,这些命令可以被解释器(如bash)
    的头像 发表于 11-08 10:08 708次阅读

    shell并行执行java脚本

    Shell是一种用于解释执行命令脚本语言,而Java是一种跨平台的面向对象编程语言。在某些情况下,我们可能需要在Shell脚本
    的头像 发表于 11-08 10:29 274次阅读

    docker exec命令的使用方法

    有用的命令,用于在正在运行的容器中执行命令。 在本文中,我将详细介绍Docker exec命令的使用方法,包括命令格式、参数选项、使用示例等
    的头像 发表于 11-23 09:33 749次阅读