【转自】https://blog.csdn.net/xy913741894/article/details/73849441
shell脚本运行的原理(source命令等)
2017年06月28日 16:29:36
阅读数:2454
Shell英文意思是外壳, 用户可以通过Shell和操作系统交互,通俗的讲Shell就是一个解释器,当我们输入命令Shell就解释执行,Shell有很多版本,我们一般使用的都是bash,在Linux输入一条命令可以查看当前正在使用的Shell:
echo $SHELL
- 1
屏幕会出现:
/bin/bash
- 1
Shell有两种方式:
因此,我们主要来学习Shell脚本编程。
在理解Shell脚本运行的原理之前,我们必须得先搞清楚shell运行的原理:
当我们在Linux下输入:
ls -al 或者 cd ..
到底发生了什么?
在解释原理之前,我们必须分清楚的是:我们在Linux输入的命令是有区别的,具体来说,分为内部命令(built-in)以及外部命令,向ls,cat,mkdir这些都属于外部命令,而echo,cd,pwd这些都属于内置命令,如何区分这些命令是否是内置,外部命令,可以利用type命令来辨别
输入ls,cd这些内部或者外部的命令有什么区别?具体而言:
像cd,pwd这些内置命令是属于Shell的一部分,当Shell一运行起来就随Shell加载入内存,因此,当我们在命令行上输入这些命令就可以像调用函数一样直接使用,效率非常高。
而如ls,cat这些外部命令却不是如此,当我们在命令行输入cat,当前的Shell会fork一个子进程,然后调用exec载入这个命令的可执行文件,比如bin/cat,因此效率上稍微低了点。
理解了单个命令的运行原理,我们现在探究当编写一个Shell脚本运行的原理,首先需要的说明的是,Shell,和Python一样,都是一门解释性语言,所谓的解释性语言就是不用编译,执行一行解释一行。
当我们编写一个Shell脚本test.sh,比如:
#!/bin/bash
echo "hello"
ls -al
在Linux命令输入./ test.sh时(需要加可执行权限)时,我们在这个文本文件开头指定了bash为默认的解释器,因此当前的交互式Shell会fork一个子进程,用bash解释器的代码去替换(也就是exec),而这个文本文件被当作是命令行参数传给这个子bash,等这个子bash执行完就会到我们的交互式bash了。
为了验证我们所说的交互式bash会fork/exec一个子bash来执行命令而非交互式bash,我们做个测试:
1.直接在交互式bash输入:
cd ..
2.编写脚本test.sh,然后运行:
//其中test.sh内容如下:
#!/bin/bash
cd ..
在Linux命令行输入 ./test.sh
结果如下:
我们发现同样都是cd ..,为什么执行完脚本当前bash目录不变,这就证明了我们所说的是由子bash执行,而非交互式bash,那么如何交互式bash执行脚本呢,我们可以使用. 或者source命令,如下图: