浅谈Linux中的Shell及其原理

news2025/3/15 13:28:24

浅谈Linux中的Shell及其原理

  • Linux中Shell的运行原理
  • github地址
    • 前言
    • 一、Linux内核与Shell的关系
      • 1.1 操作系统核心
      • 1.2 用户与内核的隔离
    • 二、Shell的演进与核心机制
      • 2.1 发展历程
      • 2.2 核心功能解析
      • 2.3 shell的工作流程
        • 1. 用户输入命令
        • 2. 解析器拆分指令
        • 3. 扩展器处理动态内容
          • 变量替换
          • 通配符扩展
          • 命令替换
        • 4. 执行器运行命令
        • 5. 内核处理系统调用
        • 6. 返回结果
        • 关键组件协作
    • 三、Shell家族与使用技巧
      • 3.1 主流Shell对比
      • 3.2 实用技巧
        • 导航类:
        • 编辑类:
        • 历史命令:
    • 四、Shell核心原理深入
      • 4.1 命令执行四阶段
      • 4.2 重定向原理
    • 总结

Linux中Shell的运行原理

github地址

有梦想的电信狗

前言

Shell作为用户与Linux内核交互的桥梁,是系统管理员和开发者的核心工具。本文深入解析Shell的核心原理与高效使用技巧,帮助读者掌握这一重要工具。

对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。

shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户

一、Linux内核与Shell的关系

1.1 操作系统核心

Linux内核作为操作系统的核心引擎,承担着以下关键职责:

  • 硬件抽象:通过设备驱动管理硬件资源
  • 进程管理:使用CFS调度器进行任务调度(Linux 2.6.23+)
  • 内存管理:采用伙伴系统分配算法
  • 文件系统:支持ext4、XFS、Btrfs等多种文件系统
  • 网络协议栈:实现TCP/IP协议族

1.2 用户与内核的隔离

我们所有的指令最终都要在OS内部运行,但用户和操作系统内核往往是隔离的。

  • 一方面直接使用OS内核的难度比较高,绝大多数用户无法做到直接和OS打交道。
  • 另一方面:直接操作内核可能导致系统崩溃、权限绕过等风险。

windows中的图形化界面和Linux中的命令行解释器(shell)充当了一个安全代理的角色。

shell的作用有以下两3个:

  1. 将使用者的命令翻译给核心(kernel)处理。
  2. 核心的处理结果翻译给使用者
  3. 对于用户错误的、权限之外的危险行为,直接在shell层面报错,防止用户的行为破坏操作系统。

二、Shell的演进与核心机制

2.1 发展历程

1971 Thompson Shell
1979 Bourne Shell
1989 Bash
2005 Fish

2.2 核心功能解析

  1. 命令解析流程
    词法分析(识别命令、参数)
    语法解析(处理管道、重定向)
    语义分析(变量扩展)

  2. 进程创建机制

shell其实是操作系统之上的一种软件,我们在shell中输入的所有命令,都是shell命令行解释器的子进程,因此shell有自己的进程创建机制。

pid_t pid = fork();  // 创建子进程
if(pid == 0){
    execvp(command, args);  // 替换进程映像
} else {
    waitpid(pid, &status, 0);  // 等待子进程
}
  1. 环境管理
    • 通过PATH环境变量查找可执行文件
    • 使用alias创建命令别名

2.3 shell的工作流程

shell的工作流程如下图所示。

用户 Shell 解析器 扩展器 执行器 内核 输入命令 拆分指令 变量替换 创建进程 系统调用 返回结果 用户 Shell 解析器 扩展器 执行器 内核

对照着图片来理解一下流程。

1. 用户输入命令
  • 用户通过终端输入命令行指令(例如 ls -l *.txt)。
  • Shell 进入读取-解析-执行循环(REPL)
2. 解析器拆分指令
# 示例输入命令
ls -l $HOME/*.txt
  • Shell 将原始命令传递给 解析器(Parser)
    • 按空格、引号等拆分出命令主体 ls、选项 -l 和未处理部分 $HOME/*.txt
    • 识别特殊符号(如管道 |、重定向 >
3. 扩展器处理动态内容
变量替换
  • $HOME 替换为环境变量值(如 /home/user
通配符扩展
  • 展开 *.txt 为匹配的文件名(如 file1.txt file2.txt
命令替换
  • 处理 `date`$(date) 为子命令输出结果
4. 执行器运行命令
# 扩展后的最终命令可能是:
ls -l /home/user/file1.txt /home/user/file2.txt
  • **执行器(Executor)**操作:
    1. 调用 fork() 创建子进程
    2. 在子进程中通过 exec() 加载 /bin/ls 程序
    3. 父进程通过 wait() 等待子进程结束
5. 内核处理系统调用
  • 子进程运行时涉及的系统调用:
    系统调用类型示例作用
    文件操作open(), read()访问文件系统
    进程控制fork(), exec()管理进程生命周期
    内存管理brk(), mmap()分配内存空间
6. 返回结果
  • 内核将以下结果返回给用户:
    • 标准输出(stdout):命令的正常输出
    • 标准错误(stderr):错误信息
    • 退出状态码(通过 $? 查看)

关键组件协作
组件角色说明
Shell用户与操作系统的桥梁,协调整个执行流程
解析器分析命令语法结构,拆分为可执行单元
扩展器处理变量、通配符、算术扩展等动态内容
执行器管理进程创建、信号处理和资源分配
内核实际操作硬件资源(CPU调度、内存分配、设备驱动等)的核心层

三、Shell家族与使用技巧

3.1 主流Shell对比

特性BashZshFish
自动补全★★★★★★★★★★★★★
配置复杂度中等
启动速度较慢中等

3.2 实用技巧

  1. 查看当前Linux系统中的可用Shell
cat /etc/shells

在这里插入图片描述2. 高效快捷键

导航类:
快捷键功能描述
Ctrl + A移动到行首
Ctrl + E移动到行尾
Alt + B向后跳一个单词
Alt + F向前跳一个单词
编辑类:
快捷键功能描述
Ctrl + U删除到行首
Ctrl + K删除到行尾
Ctrl + W删除前一个单词
Ctrl + Y粘贴上次删除内容
Ctrl + C终止当前程序
Tab补全命令
Ctrl + d退出当前登陆
历史命令:
快捷键功能描述
Ctrl + R反向搜索历史
Ctrl + P上一条命令(同↑)
Ctrl + N下一条命令(同↓)
!!执行上一条命令

四、Shell核心原理深入

4.1 命令执行四阶段

  1. 读取:通过readline库获取输入
  2. 解析:识别管道、重定向符号
  3. 扩展:处理$VAR变量替换
  4. 执行:区分内置命令与外部程序

4.2 重定向原理

文件描述符映射表:

FD用途默认指向
0标准输入键盘
1标准输出终端

示例解析:

cmd > file 2>&1  # 将标准输出和错误都重定向到文件

总结

Shell作为Linux系统的核心接口,其核心价值体现在

  1. 安全隔离用户与内核
  2. 提供灵活的命令扩展机制
  3. 支持自动化脚本开发(如shell脚本)

以上就是本文的所有内容了,如果觉得文章写的不错,还请留下免费的赞和收藏,也欢迎各位大佬在评论区交流

分享到此结束啦
一键三连,好运连连!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM内部寄存器与常用汇编指令(ARM汇编)

1 地址空间&RISC与CISC CISC:复杂指令集计算机 RISC:精简指令集计算机 RISC 与 CISC 的比较 2 ARM内部寄存器 3 ARM汇编概述 RISC精简指令可以大致分为几类: 1.内存读写 2.运算 3.跳转/分支 4.比较 而指令的集合就称之为“指令集”…

【QT5 Widgets示例】Model/View编程初探

文章目录 Model/ViewModel/View编程的优点常见Model类和View类Model/View应用程序示例只读的表格修改文本外观显示变化的数据设置表格标头可编辑视图示例树结构视图示例获取视图选中项 Model/View Model/View编程的优点 Model/View编程介绍:https://doc.qt.io/qt-…

一键优化右键菜单,高效又清爽!

打工人们你们好!这里是摸鱼 特供版~ 电脑右键菜单杂乱无章,常用功能被淹没?图标显示异常、打印出错让人手足无措?别担心,Easy Context Menu来帮你!这是一款右键菜单管理工具,能快速清理不必要的…

成绩排序(结构体排序)

成绩排序 #include<stdio.h> #include<stdlib.h> struct student{char name[50];int score;int order; }; int flag; int cmp(const void *a,const void *b){struct student *s1(struct student*)a;struct student *s2(struct student*)b;if(s1->scores2->…

OpenHarmony-XTS测试

OpenHarmony-XTS测试 OpenHarmony-XTS测试环境搭建测试准备开始运行PS OpenHarmony-XTS测试 针对OpenHarmony版本进行XTS测试使用记录。 windows环境。 以acts套件为例。 环境搭建 获取测试套件&#xff0c;两种方法 1&#xff09;官网下载&#xff1a;https://www.openharm…

【物联网-WIFI】

物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-

linux常用基本指令汇总

文章目录 01. ls指令02. pwd指令03. cd指令04. touch指令05. mkdir指令06. rmdir指令07. rm指令08. man指令09. cp指令10. mv指令11. cat指令11. more指令12. less指令13. head指令14. tail指令15. time指令16. cal指令17. find指令18. grep指令19. zip/unzip指令20.tar指令21.…

Docker Desktop 安装与使用详解

目录 1. 前言2. Docker Desktop 安装2.1 下载及安装2.2 登录 Docker 账号2.3 进入 Docker Desktop 主界面 3. Docker 版本查看与环境检查3.1 查看 Docker Desktop 支持的 Docker 和 Kubernetes 版本3.2 检查 Docker 版本 4. Docker Hub 和常用镜像管理方式4.1 使用 Docker Hub4…

【HarmonyOS Next】鸿蒙应用常规面试题和答辩思路参考

【HarmonyOS Next】鸿蒙应用常规面试题和答辩思路参考 一、充分了解岗位JD要求 根据招聘发布的岗位JD&#xff0c;进行自我匹配分析。了解基本要求和加分项&#xff0c;以及项目节奏和英文要求等。 技术不匹配的点&#xff0c;是否会影响应聘岗位加分项自己是否掌握&#xf…

《计算机图形学》第二课笔记-----二维变换的推导

前言&#xff1a;为什么这么突兀的把这一节内容放在了第二课&#xff0c;第一是因为我急于求成&#xff0c;第二是因为这一章节太重要了&#xff0c;这几乎是二维三维变换的最核心的东西&#xff0c;理解了这一章节内容&#xff0c;后面的就会像打通了任督二脉一样&#xff0c;…

机器学习(七)

一&#xff0c;监督学习和无监督学习聚类的数据集比较&#xff1a; 监督学习&#xff1a; 数据集包括输入的数据和与之对应的标签 无监督学习&#xff1a; 数据集仅含有输入的数据&#xff0c;要求算法自己通过所给的数据集来确定决策边界 二&#xff0c;聚类(Clustering): 聚…

利用labelimg实现yolov8数据集的制作

我们在使用yolov8进行物体检测识别的时候&#xff0c;由于其内置的n,s,m等模型只包含90多种物体&#xff08;很多其他物品并未包含在其中&#xff09;&#xff0c;导致我们无法直接使用其模型进行视频或者图片的检测识别。这个时候&#xff0c;我们就需要自己制作数据集进行训练…

【0x80070666】-已安装另一个版本...(Tableau 安装失败)

第一种是之前安装过tableau相关软件&#xff0c;但是没卸载干净。 方法1&#xff1a;卸载旧版本 打开 控制面板 → 程序和功能&#xff08;或 添加/删除程序&#xff09;。查找 Tableau Desktop&#xff0c;如果已安装旧版本&#xff0c;卸载它。重新启动电脑后再尝试安装。 …

Word填写窗口功能详解:如何让文档填写更高效?

在日常办公中&#xff0c;我们经常需要让他人填写一些固定格式的文档&#xff0c;比如合同、申请表、调查问卷等。如果直接使用普通文本编辑&#xff0c;填写时可能会破坏排版&#xff0c;甚至修改了不该改动的内容。这时候&#xff0c;Word的填写窗口&#xff08;即“内容控件…

Oracle数据库存储结构--逻辑存储结构

数据库存储结构&#xff1a;分为物理存储结构和逻辑存储结构。 物理存储结构&#xff1a;操作系统层面如何组织和管理数据 逻辑存储结构&#xff1a;Oracle数据库内部数据组织和管理数据&#xff0c;数据库管理系统层面如何组织和管理数据 Oracle逻辑存储结构 数据库的逻…

简单创建一个Django项目并配置neo4j数据库

创建项目&#xff0c;项目的文件夹就是项目的名称 创建项目的基本框架 安装djangorestframework 单击运行 查看浏览器运行效果&#xff1a; 运行效果如下&#xff1a; 创建应用(假如说是创建一个名为myapp的应用)&#xff1a; python manage.py startapp myapp创建之后的…

java实现智能家居控制系统——入门版

文章目录 一、需求二、业务分析三、具体实现创建一个功能接口&#xff0c;实现设备的开关创建一个家电类&#xff0c;作为功能接口的实现类&#xff0c;定义名字和状态分别创建电视机、洗衣机、电灯的类&#xff0c;继承家电类Tv类WashMachine类Lamp类 定义智能控制系统类&…

VSCode C/C++ 开发环境完整配置及常见问题(自用)

这里主要记录了一些与配置相关的内容。由于网上教程众多&#xff0c;部分解决方法并不能完全契合我遇到的问题&#xff0c;因此我选择以自己偏好的方式&#xff0c;对 VSCode 进行完整的配置&#xff0c;并记录在使用过程中遇到的问题及解决方案。后续内容也会持续更新和完善。…

实用小工具——快速获取数据库时间写法

最近我遇到了一个比较棘手的问题&#xff1a;在工作中&#xff0c;各个项目所使用的数据库类型各不相同。这导致我习惯性地使用Oracle的SQL语句进行编写&#xff0c;但每次完成后都会遇到报错&#xff0c;最终才意识到项目的数据库并非Oracle。为了避免这种情况&#xff0c;我需…

基于ssm的宠物医院信息管理系统(全套)

一、系统架构 前端&#xff1a;html | layui | vue | element-ui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat | idea | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页…