通过对比声明了解释器的解释器文件与不声明解释器的shell脚本这两种脚本的执行过程来深入理解shell中运行程序的原理

在shell中执行一个机器可执行程序的大致过程是: shell程序通过fork一个子进程, 然后执行exec函数, 机器可执行文件的名称和命令行输入的其他参数作为exec函数的参数

在shell中执行一个解释器文件(开头带解释器声明)的大致过程: shell程序先通过fork一个子进程, 然后执行exec函数, exec函数可以识别开头带有#! usr/bin/awk此类的带解释器的解释器文件, 之后, exec函数就该解释器的绝对路径/usr/bin/awk和该解释器文件的绝对路径和命令行输入的其他参数作为函数参数然后执行

在shell中执行一个shell脚本(不带解释器生声明的脚本)的大致过程: shell程序先通过fork一个子进程, 然后执行execlp函数, 但该解释器文件的开头没有带解释器的声明(如:#! /usr/bin/awk), 所以execlp起初以为它是一个机器可执行文件文, 但解释器文件不是一个机器可执行的文件, 所以返回一个错误, 这是execlp会认为这是一个shell脚本, 于是就会默认将shell脚本解释器\bin\sh作为execlp函数的pathname参数, shelll脚本的路径和其他命令行参数作为execlp的参数然后执行. 如果该脚本中会用到其他程序如awk, 为了运行awk, 则又会执行fork,execlp, wait. 所以如果shell脚本中需要用到其他程序文件, 用解释器文件(声明了解释器)会比shell脚本(不声明解释器)开销更小, 即减少了一次fork, execlp, wait

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值