shell脚本的运行机制

一、shell简介

给出三种定义,方便大家理解shell。

  • Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

  • Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

  • Shell脚本解释器,用来解析shell语言,就是一个命令行解释器。(BASH是Shell的一种,是大多数LINUX发行版默认的SHELL,除BASH Shell外还有C Shell等其它类型的Shell。)

二、shell的运行原理

2.1 外壳程序

Linux严格意义上是一个操作系统,我们称为核心,但我们一般的用户是不能直接使用核心的,而是通过外壳程序。也就是shell,对比Windows,图形界面就是外壳程序。shell的简单定义就是命令行解释器,功能是将使用者的命令翻译给核心处理,同时将核心处理的结果翻译给使用者。可以看出shell主要是对我们的指令进行解析,解析指令给Linux内核;反馈结果在通过内核运行出结果,通过shell解析给用户。

2.2 shell的两种运行方式

  • Interactive(交互式)
    shell的作用是解释执行用户的命令,用户输入一条命令,shell就解释执行一条。也就是平时我们使用的命令行语句。

  • Batch(批处理)
    Batch是指用户实现写一个shell脚本(Scripts),其中很多条命令,让shell一次把这些命令执行完,而不必一条一条地敲命令。shell-batch脚本和编程语言很相似,也有变量和控制流程语句。但是shell脚本是解释执行的,不需要编译,shell程序从脚本中一行一行读取并执行这些命令,相当于用户吧脚本中的命令一行一行敲到shell提示符下执行(也即一行一行在Interactive中执行)。

    另外,batch-shell在解释命令的时候并不是自己亲自执行,而是派生子进程让子进程去完成这项工作,这样的好处是把风险交给别人,当指令的执行出现问题时不会影响到shell(影响到其他指令的执行)。shell不可以挂,shell 一旦挂就没有什么可以解释命令了。对我们而言shell为了保证自己风险最低,通过创建子进程进行命令行的解释工作,而shell自己只要去等就可以了。

三、Shell脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

四、Shell脚本解释器

  • Linux的Shell脚本解释器种类众多,一个系统可以存在多个shell脚本解释器,可以通过以下命令查看系统中安装的shell脚本解释器。
cat /etc/shells 
  • 运行结果
    在这里插入图片描述
    bash由于易用和免费,在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell脚本解释器。

  • shell脚本头,#!/bin/sh与#!/bin/bash的区别
    GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell)的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash Debian Almquist Shell),并建议将/bin/sh指向它(软链),以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。

sh一般设成bash的软链
在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
也就是说 /bin/sh 相当于 /bin/bash --posix
sh跟bash的区别,实际上就是bash有没有开启posix模式的区别

五、验证Bash-shell的运行机制

  • 首先需要的说明的是,Shell,和Python一样,都是一门解释性语言,所谓的解释性语言就是不用编译,执行一行解释一行。
  • 当我们编写一个Shell脚本test.sh,比如:
#!/bin/bash

echo "hello"
ls -al

在Linux命令输入./ test.sh时(需要加可执行权限)时,我们在这个文本文件开头指定了bash为默认的解释器,因此当前的交互式Shell会fork一个子进程,用bash解释器的代码去替换(也就是exec),而这个文本文件被当作是命令行参数传给这个子bash,等这个子bash执行完就会到我们的交互式bash了。

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

参考链接:
shell快速入门
shell脚本运行原理

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值