【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.pswp.cn/news/898393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898393.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

可視化圖解算法:鏈表中倒數(最后)k個結點

1. 題目 描述 輸入一個長度為 n 的鏈表,設鏈表中的元素的值為ai ,返回該鏈表中倒數第k個節點。 如果該鏈表長度小于k,請返回一個長度為 0 的鏈表。 數據范圍:0≤n≤105,0 ≤ai≤109,0 ≤k≤109 要求&am…

在線教育網站項目第四步:deepseek騙我, WSL2不能創建兩個獨立的Ubuntu,但我們能實現實例互訪及外部訪問

一、說明 上一章折騰了半天,搞出不少問題,今天我們在deepseek的幫助下,完成多個獨立ubuntu24.04實例的安裝,并完成固定ip,實踐證明,deepseek不靠譜,浪費我2個小時時間,我們將在下面實…

CMake 保姆級教程

CMake 是一個跨平臺的構建工具,用于生成適合不同平臺和編譯器的構建系統文件(如 Makefile 或 Visual Studio 項目文件)。 在 Windows 下使用 CMake 構建項目時,CMake 會根據 CMakeLists.txt 文件生成適合 Windows 的構建系統文件&…

zabbix數據庫溯源

0x00 背景 zabbix數據庫如果密碼泄露被登錄并新增管理員如何快速發現?并進行溯源? 本文介紹數據庫本身未開啟access log的情況。 0x01 實踐 Mysql 數據庫查insert SELECT * FROM sys.host_summary_by_statement_type where statement like %insert% 查…

Spring Boot集成PageHelper:輕松實現數據庫分頁功能

Spring Boot集成PageHelper:輕松實現數據庫分頁功能 1. 為什么需要分頁? 分頁是處理大數據量查詢的核心技術,其重要性體現在: 性能優化:避免單次查詢返回過多數據導致內存溢出或響應延遲。用戶體驗:前端展…

Spring Cloud之負載均衡之LoadBalance

目錄 負載均衡 問題 步驟 現象 什么是負載均衡? 負載均衡的一些實現 服務端負載均衡 客戶端負載均衡 使用Spring Cloud LoadBalance實現負載均衡 負載均衡策略 ?編輯 ?編輯LoadBalancer原理 服務部署 準備環境和數據 服務構建打包 啟動服務 上傳J…

數據無憂:自動備份策略全解析

引言 在信息化飛速發展的今天,數據已成為個人、企業乃至國家最為寶貴的資產之一。無論是日常辦公文檔、科研數據、客戶資料,還是個人隱私信息,一旦丟失或損壞,都可能帶來不可估量的損失。因此,備份文件作為數據安全的…

Latex2024安裝教程(附安裝包)Latex2024詳細圖文安裝教程

文章目錄 前言一、Latex2024下載二、Texlive 2024安裝教程1.準備安裝文件2.啟動安裝程序3.配置安裝選項4.開始安裝5.安裝完成6.TeX Live 2024 安裝后確認 三、Texstudio 安裝教程1.準備 Texstudio 安裝2.啟動 Texstudio 安裝向導3.選擇安裝位置4.等待安裝完成5.啟動 Texstudio6…

C++ 語法之函數和函數指針

在上一章中 C 語法之 指針的一些應用說明-CSDN博客 我們了解了指針變量&#xff0c;int *p;取變量a的地址這些。 那么函數同樣也有個地址&#xff0c;直接輸出函數名就可以得到地址&#xff0c;如下&#xff1a; #include<iostream> using namespace std; void fun() …

centos【rockylinux】安裝【supervisor】的注意事項【完整版】

重新加載 systemd 配置推薦使用pip的方式安裝 pip install supervisor 第二步&#xff1a;添加supervisord.conf配置文件 [unix_http_server] file/tmp/supervisor.sock ; UNIX socket 文件&#xff0c;supervisorctl 會使用 ;chmod0700 ; socket 文件的…

Spring Cloud Gateway 使用ribbon以及nacos實現灰度發布

1、Spring Cloud Gateway配置文件 gateway:userId-limit: 1000 agent-bff:ribbon:NFLoadBalancerRuleClassName: com.anlitech.gateway.gray.GrayRule operator-bff:ribbon:NFLoadBalancerRuleClassName: com.anlitech.gateway.gray.GrayRule spring:cloud:gateway:locator:en…

關于“碰一碰發視頻”系統的技術開發文檔框架

以下是關于“碰一碰發視頻”系統的技術開發文檔框架&#xff0c;涵蓋核心功能、技術選型、開發流程和關鍵模塊設計&#xff0c;幫助您快速搭建一站式解決方案 --- 隨著短視頻平臺的興起&#xff0c;用戶的創作與分享需求日益增長。而如何讓視頻分享更加便捷、有趣&#xff0c…

基于django+vue的購物商城系統

開發語言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;PyCharm 系統展示 系統首頁 熱賣商品 優惠資訊 個人中心 后臺登錄 管理員功能界面 用戶管理 商品分類管理…

Ardunio 連接OLED觸摸屏(SSD1106驅動 4針 IIC通信)

一、準備工作 1、硬件 UNO R3 &#xff1a;1套 OLED觸摸屏&#xff1a;1套 導線諾干 2、軟件 arduino 二、接線 UNO R3OLED5VVCCGNDGNDA5SCLA4SDA 腳位如下圖所示&#xff1a; Uno R3腳位圖 觸摸屏腳位圖 查閱顯示屏的驅動規格&#xff1a;通常顯示屏驅動芯片有SSD1306,SH110…

機器人技能列表

一、機器人制作基礎入門 &#xff08;一&#xff09;機器人概述 1.機器人的定義與分類 2.機器人的發展歷程與現狀 3.機器人在各領域的應用案例 &#xff08;二&#xff09;必備工具與材料 4.常用電子工具介紹&#xff08;萬用表、電烙鐵等&#xff09; 5.機械加工工具&…

07. 面向對象高級(2)_設計模式

什么是設計模式 一個問題通常有種解法&#xff0c;其中肯定有一種解法是最優的&#xff0c;這個最優的解法被人總結出來了&#xff0c;稱之為設計模式。 設計模式有20多種&#xff0c;對應20多種軟件開發中會遇到的問題。 關于設計模式&#xff0c;主要學什么&#xff1f; 解…

【面試場景題-Redis中String類型和map類型的區別】

今天在面試中碰到一個場景題&#xff1a;在 Redis 中存儲 100 萬用戶數據時&#xff0c;使用 String 類型和 Hash&#xff08;Map&#xff09;類型的主要區別是什么&#xff1f;體現在以下幾個方面&#xff1a; 1. 存儲結構與內存占用 String 類型 存儲方式&#xff1a;每個用…

計算機操作系統和進程

目錄 一. 操作系統 1. 操作系統的概念 2. 操作系統的功能 二. 進程 1. 進程的概念 2. 進程在系統中的管理 3. PBC &#xff08;1&#xff09;pid &#xff08;2&#xff09;內存指針 &#xff08;3&#xff09;文件標識符 4. 資源分配 5. 進程的調度 &#xff08;…

【Matlab GUI】封裝matlab GUI為exe文件

注&#xff1a;封裝后的exe還是需要有matlab環境才能運行 &#xff08;1&#xff09;安裝MCRinstaller.exe文件&#xff0c;在matlab安裝目錄下的toolbox/compiler/deploy/win64文件夾里 &#xff08;2&#xff09;安裝完MCRinstaller.exe&#xff0c;字命令窗口輸入&#x…

登山第二十梯:無人機實時自主探索——我是一只小小小鳥

文章目錄 一 摘要 二 資源 三 內容 一 摘要 自主探索是無人機 &#xff08;UAV&#xff09; 各種應用的基本問題。最近&#xff0c;基于 LiDAR 的探索因其能夠生成大規模環境的高精度點云地圖而受到廣泛關注。雖然點云本身就為導航提供了信息&#xff0c;但許多現有的勘探方…