标签:linux inux 解释器 没有 工具 命令 系统默认 流程 src
Shell是一个命令行工具。Shell(也成为终端或者壳)充当的是人与内核(硬件)之间的翻译官。用户报一些命令“告诉”终端,他就会调用相应的程序服务去完成某些工作。现在包括红帽系统在内的许多主流的Linux系统默认使用的终端是Bash(Bourne Again SHell)解释器。
如图,bash可以从标准输入或者文件中读取命令。
如图bash是可以嵌套的。当我们打一个exit就会推出一个bash。多打一个exit的话便会退出SSH连接。
创建sh01.sh文件,输入如下内容:
我们使用source命令来执行我们的sh文件,source是内部命令,具体含义如下:“在当前shell执行文件中的命令”.什么是当前shell?我们说过bash是可以嵌套的。不同的bash执行相同的命令,可能结果不同(比如 echo $$ 来输出当前进程号),所有当前shell就是指的现在所在层的bash。
执行结果如下:
与source命令相同 .也表示在当前shell执行文件内的命令:
bash具有层级关系,我们可以通过pstree命令来查看bash的层级关系,示例如下:
系统进入默认是第一层bash【1235】,当我们再键入一个bash命令就会嵌套一层bash,依次类推,才有了我们进程号为1798、1805的bash。
思考:既然bash是一个命令,那么我么是否可以bash执行文件内容呢?
当然可以。但是又会嵌套一层bash,具体如下:
但是我们执行pstree命令却发现为什么只有最外面一层默认的父bash,而没有执行sh01.sh文件的子bash呢?
显然这个过程是先开启bash然后执行完毕后再退出bash。
我们知道yum工具执行的是python脚本,那我们来看一下我么的yum文件more /usr/bin/yum
我们发现,yum文件在第一行声明了python脚本,说明要启动一个python的终端。也就是这样一个流程:
我们当前的bash读取到文件的第一行后启动相应的子终端,然后子终端执行下面的命令。
同理我们也同样可以声明我们的sh01.sh:
我们使用当前bash命令执行source或者 . ,执行结果并没有什么改变:
我们通过chmod +x命令来将其改变为可执行文件来执行:
我们发现进程号不是1235了,而是1845;并且当前默认bash下层也有了子层级。说明我们的bash确实是读取可执行文件sh01.sh的首行来启动新的bash来执行文件内的命令。
注意:事实上首行不声明也能执行。因为我们bash执行文件会默认打开一个子bash执行文件内命令。但是如果是python脚本文件的话就必须首行声明,因为启动的是bash来而非python终端来执行python命令是会报错的。
标签:linux inux 解释器 没有 工具 命令 系统默认 流程 src
原文地址:https://www.cnblogs.com/nm666/p/10865385.html