• 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 
    
    • 1
    • 运行结果
      在这里插入图片描述
      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模式的区别
    
    • 1
    • 2
    • 3
    • 4

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

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

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

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

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

  • 相关阅读:
    element-ui中表格树类型数据的显示
    疯 狂 的 文 件 夹 【收藏起来】
    机器学习05|一万五字:SVM支持向量机01 【原理详解篇】
    Spring Reactive:响应式编程与WebFlux的深度探索
    教你复制大量文件,保存到多个文件夹中
    caffe之upsample实现
    1.7-02:找第一个只出现一次的字符
    Avalonia开发(二)项目结构解析
    【二】2D测量 Metrology——get_metrology_object_model_contour()算子
    flink双流join结果数据重复问题排查
  • 原文地址:https://blog.csdn.net/qq_41156733/article/details/126762320