Linux Shell编程之谈谈bash

Shell是一个命令行工具。Shell(也成为终端或者壳)充当的是人与内核(硬件)之间的翻译官。用户报一些命令“告诉”终端,他就会调用相应的程序服务去完成某些工作。现在包括红帽系统在内的许多主流的Linux系统默认使用的终端是Bash(Bourne Again SHell)解释器。

一、bash的优势

  • 通过上下方向键来调取过往执行过得Linux命令
  • 命令或参数仅需要输入前几位就可以用Tab键补全
  • 具有强大的批处理脚本
  • 具有实用的环境变量功能

二、bash的使用

如图,bash可以从标准输入或者文件中读取命令。

1. 标准输入读取命令

如图bash是可以嵌套的。当我们打一个exit就会推出一个bash。多打一个exit的话便会退出SSH连接。

2. 从文件中读取命令

创建sh01.sh文件,输入如下内容:

我们使用source命令来执行我们的sh文件,source是内部命令,具体含义如下:“在当前shell执行文件中的命令”.什么是当前shell?我们说过bash是可以嵌套的。不同的bash执行相同的命令,可能结果不同(比如 echo $$ 来输出当前进程号),所有当前shell就是指的现在所在层的bash。

执行结果如下:

source命令相同 .也表示在当前shell执行文件内的命令:

3.bash的层级关系

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命令是会报错的。

猜你喜欢

转载自www.cnblogs.com/nm666/p/10865385.html