当前位置: 首页 > 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脚本)

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

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


http://www.kler.cn/a/585526.html

相关文章:

  • 使用 Python 爬取微店关键词搜索接口(micro.item_search)的完整指南
  • 【赵渝强老师】达梦数据库的目录结构
  • 基于图像比对的跨平台UI一致性校验工具开发全流程指南——Android/iOS/Web三端自动化测试实战
  • Safe “AI Agentathon 2025”:加密领域的 AI Agent 开发者盛会
  • [C语言基础]13.动态内存管理
  • Centos离线安装gcc
  • 探索CSS魔法:3D翻转与渐变光效的结合
  • 品铂科技高精度UWB定位系统助力2018年北京冬奥会
  • k8s基础架构介绍
  • 一般机器学习有哪些算法?
  • 共享内存的通信
  • 境内深度合成服务算法备案通过名单分析报告
  • 西游记英文版108天社里学练活动总结与感言
  • .NET Core 中如何实现缓存的预热?
  • 卷积神经网络 - 基本概念
  • 用Maven创建只有POM文件的项目
  • clickhouse网络安全日志 网络安全日志保存时间
  • Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
  • pytorch中的基础数据集
  • 深搜专题8:N皇后