Shell脚本工作原理

我们知道Shell脚本是一种解释性的语言,是不用编译的,那么它是如何执行程序的呢?

chmod u+x test.sh
./test.sh
  • Shell会fork()一个子进程,然后调用exec()执行,exec()会用把子进程的代码段替换成test.sh程序的代码段,然后开始执行,父进程等待子进程终止;
  • 但是由于test.sh是一个文本文件,并没有代码段和_start函数,这是exec()的另一种机制,如果要执行的是一个文本文件,并且第一行用shebang指定了解释器,则用解释器的代码替换当前进程,并从解释器的_start开始执行,这个文本文件被单做命令行参数传递给解释器。

有一种现象,在脚本中执行cd命令,发现回显消息当前所处的目录发生改变,但是真实的目录却没有变。
这里写图片描述
这也很好理解,父进程创建子进程来执行脚本,所以,子进程并没有改变父进程的目录。但是直接在命令行中cd,结果bash的目录是可以改变的,这是为什么?

  • 这是因为cd这条命令是不需要创建子进程的命令,这种命令叫做shell的内置命令或者叫内建命令,由父bash自己执行。

这里写图片描述
可以发现用.或者source修饰的脚本,脚本执行影响了父bash,source或者.命令是shell的内建命令,这种方式不会创建子Shell,而是直接在交互式Shell下逐行执行脚本中的命令。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值