【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个:
- 将使用者的命令翻译给核心(kernel)处理。
- 将核心的处理结果翻译给使用者。
- 对于用户错误的、权限之外的危险行为,直接在shell层面报错,防止用户的行为破坏操作系统。
二、Shell的演进与核心机制
2.1 发展历程
2.2 核心功能解析
-
命令解析流程:
• 词法分析(识别命令、参数)
• 语法解析(处理管道、重定向)
• 语义分析(变量扩展) -
进程创建机制:
shell其实是操作系统之上的一种软件,我们在shell中输入的所有命令,都是shell命令行解释器的子进程,因此shell有自己的进程创建机制。
pid_t pid = fork(); // 创建子进程
if(pid == 0){execvp(command, args); // 替换进程映像
} else {waitpid(pid, &status, 0); // 等待子进程
}
- 环境管理:
• 通过PATH环境变量查找可执行文件
• 使用alias创建命令别名
2.3 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)**操作:
- 调用
fork()创建子进程 - 在子进程中通过
exec()加载/bin/ls程序 - 父进程通过
wait()等待子进程结束
- 调用
5. 内核处理系统调用
- 子进程运行时涉及的系统调用:
系统调用类型 示例 作用 文件操作 open(),read()访问文件系统 进程控制 fork(),exec()管理进程生命周期 内存管理 brk(),mmap()分配内存空间
6. 返回结果
内核将以下结果返回给用户:- 标准输出(
stdout):命令的正常输出 - 标准错误(
stderr):错误信息 - 退出状态码(通过
$?查看)
- 标准输出(
关键组件协作
| 组件 | 角色说明 |
|---|---|
Shell | 用户与操作系统的桥梁,协调整个执行流程 |
解析器 | 分析命令语法结构,拆分为可执行单元 |
扩展器 | 处理变量、通配符、算术扩展等动态内容 |
执行器 | 管理进程创建、信号处理和资源分配 |
内核 | 实际操作硬件资源(CPU调度、内存分配、设备驱动等)的核心层 |
三、Shell家族与使用技巧
3.1 主流Shell对比
| 特性 | Bash | Zsh | Fish |
|---|---|---|---|
| 自动补全 | ★★★ | ★★★★★ | ★★★★★ |
| 配置复杂度 | 中等 | 高 | 低 |
| 启动速度 | 快 | 较慢 | 中等 |
3.2 实用技巧
- 查看当前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 命令执行四阶段
- 读取:通过readline库获取输入
- 解析:识别管道、重定向符号
- 扩展:处理
$VAR变量替换 - 执行:区分内置命令与外部程序
4.2 重定向原理
文件描述符映射表:
| FD | 用途 | 默认指向 |
|---|---|---|
| 0 | 标准输入 | 键盘 |
| 1 | 标准输出 | 终端 |
示例解析:
cmd > file 2>&1 # 将标准输出和错误都重定向到文件
总结
Shell作为Linux系统的核心接口,其核心价值体现在:
- 安全隔离用户与内核
- 提供灵活的命令扩展机制
- 支持自动化脚本开发(如
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. 扩展器处理动态内容变量替…...
【JDK17】开源应用服务器大比对
接着 next-public 源代码分析,Java 应用服务器选用 jetty。但是之前普遍使用 Tomcat,那为什么要用 jetty 么,除了这两个,Java 应用服务器开源现状并不了解,故而又是一篇科普性的笔记,以下是 又小又快的 Jav…...
CI/CD构建与注意事项
1. CI/CD 概述 1.1 定义 CI(Continuous Integration,持续集成):是一种软件开发实践,开发团队成员频繁地将代码集成到共享的代码仓库中。每次集成都会通过自动化的构建(包括编译、打包等)和测试…...
数据结构篇——二叉树的存储与遍历
一、引入 书接上文,文于此续。上文我们学到了树的存储结构,那么今天,我们来学习下几种特殊的二叉树以及关于它的各种遍历,让我们一起加油吧。 二、特殊的二叉树 二叉树的特殊形式这里介绍3种,其中需要着重记忆的有…...
分而治之:用于 RGB-T 显著目标检测的 Confluent Triple-Flow 网络(问题)
摘要 问题一:RGB-thermal显著对象检测这是什么? RGB图像是可见光的三通道图像,而thermal是热红外图像,通常为单通道,记录物体的热辐射信息。结合RGB和thermal两种模态的数据,可以利用两者的互补信息&…...
求职招聘网站源码,找工作招工系统,支持H5和各种小程序
招聘找活招工平台系统源码 招聘求职找工作软件 发布信息积分充值招聘系统,里面带纤细教程 功能介绍: 招工小程序主要针对工地招工工人找工作,工地可以发布招工信息,工人可以发布找活信息,招工信息可以置顶,置顶需要积分,积分可以通过签到、分享邀请好友、充值获取,后…...
18.使用读写包操作Excel文件:xlrd、xlwt 和 xlutils 包
一 xlrd、xlwt 和 xlutils 包的介绍 OpenPyXL 和 xlrd、xlwt 、xlutils 的区别在笔记 15 。 二 如何使用 xlrd 读取文件 1.获取所有工作表的名称 book.sheet_names():得到一个列表。 import xlrd import xlwt from xlwt.Utils import cell_to_rowcol2 import xluti…...
python脚本实现服务器内存和cpu使用监控,并记录日志,可以设置阈值和采样频率
Python 脚本,实现以下功能: 按日期自动生成日志文件(例如 cpu_mem_20231001.csv)当 CPU 或内存超过阈值时触发记录独立记录报警事件(保存到 alert.log)支持自定义阈值和监控间隔 脚本代码 import psutil …...
企业微信群聊机器人开发
拿到机器人hook 机器人开发文档 https://developer.work.weixin.qq.com/document/path/91770...
基于Python的tkinter开发的一个工具,解析图片文件名并将数据自动化导出为Excel文件
文章目录 一、开发背景与业务价值二、系统架构设计1. 分层架构图解2. 核心类结构3. 文件解析流程 三、关键技术实现详解1. 高性能文件名解析引擎2. 可视化数据展示3. 智能Excel导出模块 四、完整代码五、行业应用展望 一、开发背景与业务价值 在零售行业会员管理场景中&#x…...
c++面向对象笔记
本文章总结了所有面向对象可能会用到的笔记以及知识,同时也是cGESP6级的必考题,不推荐0基础阅读,请见谅! 一.面向对象三大特性 C面向对象的三大特性:封装、继承、多态 1.封装 1.1封装的意义 封装的意义如下&#…...
pyqt 上传文件或者文件夹打包压缩文件并添加密码并将密码和目标文件信息保存在json文件
一、完整代码实现 import sys import os import json import pyzipper from datetime import datetime from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLineEdit, QLabel, QFileDialog,QMessageBox, QProgressBar) from PyQt5.…...
Flutter_学习记录_状态管理之GetX
1. 状态管理、Flutter Getx介绍 1.1 状态管理 通俗的讲:当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/Widget)中的多个子组件之间共享状态(数…...
【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)
在图片中,数据流(Data Workflow)描述了应用程序中数据的流动过程,涉及 Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件&…...
c++ 中的可变参数模板与折叠表达式
c 11 引入了可变参数模板,c 17 引入了折叠表达式,比 c 语言的可变参数更加简洁灵活。这篇博客总结了一些例子。 …(省略号)用于可变参数(Variadic Arguments),它可以放在模板参数 或 函数参数的…...
Vala教程-第一个程序(Hello world)
代码 class Demo.HelloWorld : GLib.Object {public static int main(string[] args) {stdout.printf("Hello, World\n");return 0;} } 解析 这是一个 Vala Hello World 程序。我将一步一步地介绍它。 class Demo.HelloWorld : GLib.Object { 这一行定义了一个He…...
Git下载安装(保姆教程)
目录 1、Git下载 2、Git安装(windows版) (1)启动安装程序 (2)阅读许可协议 (3)选择安装路径 (4)选择组件 (5)选择开始菜单文件夹…...
Blender-MCP服务源码2-依赖分析
Blender-MCP服务源码2-依赖分析 有个大佬做了一个Blender-MCP源码,第一次提交代码是【2025年3月7号】今天是【2025年月15日】也就是刚过去一周的时间,所以想从0开始学习这个代码,了解一下大佬们的开发思路 1-核心知识点 from mcp.server.fas…...
LabVIEW压比调节器动态试验台
本案介绍了一种基于LabVIEW的压比调节器动态试验台的设计,通过实用的LabVIEW图形化编程语言,优化了数据采集与处理的整个流程。案例通过实际应用展示了设计的专业性与高效性,以及如何通过系统化的方法实现精确的动态测试和结果分析。 项目…...
基于“动手学强化学习”的知识点(二):第 15 章 模仿学习(gym版本 >= 0.26)
第 15 章 模仿学习(gym版本 > 0.26) 摘要 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析!具体内容请阅读动手学强化学习! 对应动手学强化学习——模仿学习 # -*- coding: utf-8 -*-import gy…...
2025-03-17 Unity 网络基础1——网络基本概念
文章目录 1 网络1.1 局域网1.2 以太网1.3 城域网1.4 广域网1.5 互联网(因特网)1.6 万维网1.7 小结 2 IP 地址2.1 IP 地址2.2 端口号2.3 Mac 地址2.4 小结 3 客户端与服务端3.1 客户端3.2 服务端3.3 网络游戏中的客户端与服务端 1 网络 在没有网络之前…...
springboot441-基于SpringBoot的校园自助交易系统(源码+数据库+纯前后端分离+部署讲解等)
💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm…...
浅谈数据分析及数据思维
目录 一、数据分析及数据分析思维?1.1 数据分析的本质1.2 数据分析思维的本质1.2.1 拥有数据思维的具体表现1.2.2 如何培养自己的数据思维1.2.2.1 书籍1.2.2.2 借助工具1.2.2.3 刻意练习 二、数据分析的价值及必备能力?2.1 数据分析的价值2.1.1 现状分析…...
Hexo主题配置and常用指令
Hexo 主题配置步骤 安装Hexo: 安装Node.js和Git。使用npm安装Hexo CLI:npm install -g hexo-cli。 创建新的Hexo项目: 执行命令:hexo init <folder>,其中<folder>是你的项目目录名。进入项目文件夹&#…...
自定义uniapp组件,以picker组件为例
编写目的 本文说明基于vue3定义uniapp组件的关键点: 1、一般定义在components文件夹创建组件,组件与页面已经没有明确的语法格式区别,所以可以与页面的语法保持一致 ; 2、组件定义后使用该组件的页面不需要引用组件即可使用&am…...
测试工程师指南:基于需求文档构建本地安全知识库的完整实战
需求文档是测试工程师日常工作的核心工具,如何快速检索需求文档中的关键信息(文本、表格、图片等),并将其转化为可供 AI 查询的知识库,是提升工作效率的重要手段。本文将通过对 需求文档(docx 格式…...
IP关联的定义和避免方法
大家好!今天我们来聊一聊一个在运营多个网络账号时会遇到的重要问题——IP关联。对于那些正在运营多个账号或者进行多窗口任务的朋友们,这无疑是一个你必须关注的问题。IP关联,简单来说,就是多个账号在使用相同IP地址的情况下进行…...
浅述WinForm 和 WPF 的前景
在.NET 开发领域,WinForm 和 WPF 都是用于创建桌面应用程序的技术框架,但它们在很多方面存在差异,对于开发者来说,也常常会思考哪个更有前途。 一、WinForm 1. 成熟/稳定度: WinForms 是较早的桌面应用程序框架&am…...
CSS3学习教程,从入门到精通,CSS3 属性语法知识点及案例代码(4)
CSS3 属性语法知识点及案例代码 一、CSS3 文本属性 1. 颜色相关属性 color:设置文本颜色。text-shadow:设置文本阴影。 2. 字体相关属性 font-family:设置字体系列。font-size:设置字体大小。font-weight:设置字体…...
MyBatis SqlSession 是如何创建的? 它与 SqlSessionFactory 有什么关系?
SqlSession 是 MyBatis 中与数据库交互的核心接口,它提供了执行 SQL 语句、管理事务、获取 Mapper 接口代理对象等关键功能。 SqlSession 实例 不是直接通过 new 关键字创建的,而是通过 SqlSessionFactory 工厂来创建的。 SqlSessionFactory 负责创建 Sq…...
