全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

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

时间:2023-08-21 09:10

人气:

作者:admin

标签: LINUX内核  Shell 

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

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命令之后,它是不会被执行的。






审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信