shell脚本运行的原理(source命令等)

Shell英文意思是外壳, 用户可以通过Shell和操作系统交互,通俗的讲Shell就是一个解释器,当我们输入命令Shell就解释执行,Shell有很多版本,我们一般使用的都是bash,在Linux输入一条命令可以查看当前正在使用的Shell:

echo $SHELL

屏幕会出现:

/bin/bash

Shell有两种方式:

shell脚本运行的原理(source命令等)_第1张图片

因此,我们主要来学习Shell脚本编程。


在理解Shell脚本运行的原理之前,我们必须得先搞清楚shell运行的原理:

当我们在Linux下输入:

ls -al 或者 cd ..

到底发生了什么?

在解释原理之前,我们必须分清楚的是:我们在Linux输入的命令是有区别的,具体来说,分为内部命令(built-in)以及外部命令,向ls,cat,mkdir这些都属于外部命令,而echo,cd,pwd这些都属于内置命令,如何区分这些命令是否是内置,外部命令,可以利用type命令来辨别

shell脚本运行的原理(source命令等)_第2张图片

输入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

结果如下:

shell脚本运行的原理(source命令等)_第3张图片

我们发现同样都是cd ..,为什么执行完脚本当前bash目录不变,这就证明了我们所说的是由子bash执行,而非交互式bash,那么如何交互式bash执行脚本呢,我们可以使用. 或者source命令,如下图:

shell脚本运行的原理(source命令等)_第4张图片

shell脚本运行的原理(source命令等)_第5张图片

你可能感兴趣的:(Linux/操作系统)