当前位置: 首页 > article >正文

浅谈Linux中的Shell及其原理

浅谈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脚本)

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

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

相关文章:

浅谈Linux中的Shell及其原理

浅谈Linux中的Shell及其原理 Linux中Shell的运行原理github地址前言一、Linux内核与Shell的关系1.1 操作系统核心1.2 用户与内核的隔离 二、Shell的演进与核心机制2.1 发展历程2.2 核心功能解析2.3 shell的工作流程1. 用户输入命令2. 解析器拆分指令3. 扩展器处理动态内容变量替…...

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来帮你!这是一款右键菜单管理工具,能快速清理不必要的…...

排查数据库的正在执行的占用的慢sql语句,可以查看生产的执行sql语句时间

1. 生产报错异常: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: master - Interrupted during connection acquisition2.在数据库执行查询生…...

Java泛型程序设计使用方法

Java泛型程序设计是Java语言中一项强大的特性&#xff0c;它允许你编写更加通用和类型安全的代码。以下是Java泛型程序设计的使用方法和技巧&#xff1a; 1. 基本概念 泛型类&#xff1a;可以定义一个类&#xff0c;其中的某些类型是参数化的。 public class Box<T> {pr…...

成绩排序(结构体排序)

成绩排序 #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->…...

【redis】lua脚本

在分布式系统与高并发架构的战场中&#xff0c;开发者们始终在与两个永恒的命题博弈&#xff1a;数据一致性与系统性能。当我们试图用Redis构建高速缓存、实现分布式锁或设计秒杀系统时&#xff0c;往往会陷入这样的困境——如何在保证原子性的同时&#xff0c;避免网络往返带来…...

Oracle中的INHERIT PRIVILEGES权限

Oracle中的INHERIT PRIVILEGES权限 存储过程和用户函数的AUTHID属性调用者权限vs定义者权限一个简单的示例INHERIT PRIVILEGES权限的含义INHERIT PRIVILEGES权限的安全隐患注意到Oracle 19c数据库中有如下权限信息: SQL> select grantor,grantee,table_name,privilege fro…...

Kafka相关的面试题

以下是150道Kafka相关的面试题及简洁回答&#xff1a; Kafka基础概念 1. 什么是Kafka&#xff1f; Kafka是一个分布式、可扩展、容错的发布-订阅消息系统&#xff0c;最初由LinkedIn开发&#xff0c;现为Apache项目。它适用于高吞吐量的场景&#xff0c;如大数据处理和实时数据…...

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-...

作业9 (2023-05-05 数组的定义和初始化)

第1题/共11题【单选题】 关于一维数组初始化,下面哪个定义是错误的?( ) A.int arr[10] = {1,2,3,4,5,6}; B.int arr[] = {1,2,3,4,5,6}; C.int arr[] = (1,2,3,4,5,6); D.int arr[10] = {0}; A:正确,10个int的一段连续空间,前6个位置被初始化为1,2,3,4,5,6,其他…...

C语言中的流程控制语句

一.流程控制语句的分类&#xff1a; 1.顺序结构 概念&#xff1a;从上往下依次执行&#xff0c;也是程序默认的执行顺序 2.分支结构 概念&#xff1a;程序在执行的过程中出现了岔路&#xff08;我们只能选择一条支线进行执行&#xff09; &#xff08;1&#xff09;.if语句…...

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.…...

Python 与 JavaScript 交互及 Web 逆向分析全解析

一、引言 在当今数字化时代,软件开发的复杂性和多样性不断增加,不同编程语言之间的交互与协作变得愈发重要。Python 凭借其简洁易读的语法、丰富的库和强大的数据处理能力,在数据科学、自动化脚本编写等领域占据着重要地位。而 JavaScript 作为前端开发的核心语言,以其在网…...

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…...

鬼泣:移动系统3

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 run/Sprint混合空间输入&#xff1a;(leanAngle, maxWalkSpeed) 按布尔混合和选择的区别&#xff1a;自动生成过渡动画dead blending&#xff1a;惯性化节点疑问run/Sprint混合空间为什么速度为0时也设置奔跑动画为…...

解决 HTTP 请求中的编码问题:从乱码到正确传输

文章目录 解决 HTTP 请求中的编码问题&#xff1a;从乱码到正确传输1. **问题背景**2. **乱码问题的原因**2.1 **客户端编码问题**2.2 **请求头缺失**2.3 **服务器编码问题** 3. **解决方案**3.1 **明确指定请求体编码**3.2 **确保请求头正确**3.3 **动态获取响应编码** 4. **调…...

golang从入门到做牛马:第二十篇-Go语言接口:行为的“契约”

Go语言接口:行为的“契约” 在Go语言中,接口(interface)是一种非常强大的类型,用于定义行为的集合。接口通过描述类型必须实现的方法,规定了类型的行为契约。Go语言的接口设计简单而功能强大,是实现多态和解耦的重要工具。接下来,让我们一起深入了解Go语言中的接口。 …...

HTML5 Web SQL

HTML5 Web SQL 引言 随着互联网技术的飞速发展,HTML5 作为新一代的网页技术,已经逐渐成为网页开发的主流。在 HTML5 中,Web SQL 是一种轻量级的数据库存储技术,它允许开发者直接在网页中存储数据。本文将详细介绍 HTML5 Web SQL 的概念、特点、应用场景以及使用方法。 一…...

【品铂科技工业生产应用案例解析】

品铂科技&#xff08;Pinpoint&#xff09;在工业领域的高精度定位解决方案已广泛应用于电力、钢铁、仓储、化工、地铁等场景&#xff0c;以下为典型应用案例及技术方案&#xff1a; 一、‌电力行业&#xff1a;上海闵行电厂人员定位‌ 白鹤滩水力发电站 ‌项目需求‌&#x…...

pjsip dtmf发送和接收(pjsua)

DTMF(双音多频,Dual-Tone Multi-Frequency)是一种用于电话系统的信号技术,通过组合两个不同频率的音频信号来表示数字和符号。以下是DTMF的主要使用背景和应用场景: 电话拨号 DTMF最常见的用途是电话拨号。当用户按下电话键盘上的数字或符号时,电话会生成两个特定频率的音…...

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

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

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

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

无需微调的对齐方法URIAL

无需微调的对齐方法URIAL 研究背景与目的:LLMs的对齐调优通常采用监督微调(SFT)和强化学习从人类反馈(RLHF),但LIMA研究表明少量示例的SFT也能实现较好对齐,暗示对齐调优可能存在“表面性质”。本研究旨在探究对齐调优对基础LLMs的具体影响,并提出不依赖SFT或RLHF的对齐…...

机器学习(七)

一&#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;卸载它。重新启动电脑后再尝试安装。 …...

在rv1106上部署vue3

创建vue3项目 $ npm create vuelatest Need to install the following packages: create-vue3.15.1 Ok to proceed? (y) y > npx > create-vue┌ Vue.js - The Progressive JavaScript Framework │ ◇ 请输入项目名称&#xff1a; │ ip_cam │ ◇ 请选择要包含的…...