Shell脚本工作原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wei_cheng18/article/details/81007925

我们知道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下逐行执行脚本中的命令。

猜你喜欢

转载自blog.csdn.net/wei_cheng18/article/details/81007925