暑期自学嵌入式——Day10(C语言阶段)

接续上文: 暑期自学嵌入式------Day09(C语言阶段)-CSDN博客

【引言】

你是否曾在 Linux 系统中遇到过这些困惑:

明明下载了.deb 安装包,却因 "依赖缺失" 安装失败?想批量删除文件时,对着成百上千个文件名手足无措?分析系统日志时,只能一行行滚动查找关键词?

如果你正处于嵌入式学习的 C 语言阶段,这些问题不仅会打乱学习节奏,更可能让你对 Linux 操作产生畏难情绪。但其实,只要掌握两个核心技能 ------软件包管理Shell 高效操作,就能轻松解决 90% 的系统管理问题。

本文是 "暑期自学嵌入式" 系列的 Day10 内容,专为新手设计:

  • 从.deb 包的命名规则到 APT 工具的依赖魔法,用 "全屋定制" 的类比让你秒懂 dpkg 与 APT 的分工;
  • 从通配符批量操作到管道符串联命令,用 "传送带 + 过滤器" 的逻辑帮你掌握 Shell 的 "自动化密码";
  • 更有 "安装软件→清理日志→生成报告" 的实战场景,让你边学边用,直接将技巧转化为效率。

无论你是刚接触 Linux 的嵌入式新人,还是想提升系统操作效率的开发者,跟着本文一步步实操,你会发现:原来 Linux 操作可以像搭积木一样简单,曾经耗时半小时的重复工作,现在一行命令就能搞定。

现在,就让我们从 "手动操作" 迈向 "自动化管理",为后续嵌入式开发的环境搭建和系统调试打下扎实基础。

点关注不迷路哟。你的点赞、收藏,一键三连 ,是我++持续更新的动力哟++!!!

主页:

一位搞嵌入式的 genius-CSDN博客一位搞嵌入式的 genius擅长前后端项目开发,嵌入式自学专栏,微机原理与接口技术,等方面的知识,一位搞嵌入式的 genius关注matlab,论文阅读,前端框架,stm32,c++,node.js,c语言,智能家居,vue.js,html,npm,单片机领域.https://blog.csdn.net/m0_73589512?spm=1000.2115.3001.5343

目录

Day10

[1. Linux 软件包管理:从机制到实操的完整指南](#1. Linux 软件包管理:从机制到实操的完整指南)

一、主流软件包管理机制对比

[1. Debian 软件包机制(.deb)](#1. Debian 软件包机制(.deb))

[2. RPM 软件包机制(.rpm)](#2. RPM 软件包机制(.rpm))

[3. APT 工具的核心价值(Debian 系优势)](#3. APT 工具的核心价值(Debian 系优势))

二、软件包的类型与识别

[1. 二进制软件包(推荐新手使用)](#1. 二进制软件包(推荐新手使用))

[2. 源码包(开发者 / 高级用户使用)](#2. 源码包(开发者 / 高级用户使用))

[3. 类型识别方法](#3. 类型识别方法)

三、软件包命名规则(必学,避免装错版本)

[1. 命名格式(固定结构)](#1. 命名格式(固定结构))

[2. 常见架构标识](#2. 常见架构标识)

四、软件包管理工具(重点:命令行工具)

五、dpkg命令:底层包管理工具(核心)

[1. 常用命令(参数与功能对应)](#1. 常用命令(参数与功能对应))

[2. 实操注意事项](#2. 实操注意事项)

[六、APT工具:解决依赖的 "智能管家"](#六、APT工具:解决依赖的 “智能管家”)

[1. 核心功能](#1. 核心功能)

[2. 常用APT命令(对比dpkg)](#2. 常用APT命令(对比dpkg))

[3. dpkg与APT的分工(核心区别)](#3. dpkg与APT的分工(核心区别))

七、常见问题与解决技巧

[1. 权限不足](#1. 权限不足)

[2. 依赖缺失(dpkg安装时)](#2. 依赖缺失(dpkg安装时))

[3. 包名记不全](#3. 包名记不全)

[4. 软件安装后找不到](#4. 软件安装后找不到)

八、知识小结

九、学习建议

[2. Linux 软件包管理工具全解析(Debian/Ubuntu 体系)](#2. Linux 软件包管理工具全解析(Debian/Ubuntu 体系))

一、两大软件包管理机制对比

二、软件包的两种类型(按使用方式划分)

[1. 二进制软件包(.deb)](#1. 二进制软件包(.deb))

[2. 源码包(.deb-src)](#2. 源码包(.deb-src))

[3. 类型识别方法](#3. 类型识别方法)

三、软件包命名规则(快速识别关键信息)

实例解析:rxvt_1%3a2.6.4-14_i386.deb

常见架构标识

四、软件包管理工具(按使用界面分类)

[1. 三类工具对比](#1. 三类工具对比)

核心工具:dpkg(底层)和apt(高层)

五、dpkg命令实操(本地包管理)

常用命令速查表(参数对应功能)

实操注意事项

六、apt与dpkg的核心区别(必懂)

七、常见问题与解决技巧

八、知识小结

[3. Linux 软件包管理工具全解析(Debian/Ubuntu 体系)→补充](#3. Linux 软件包管理工具全解析(Debian/Ubuntu 体系)→补充)

[一、核心逻辑梳理:为什么 Ubuntu 用 APT 而非直接用 dpkg?](#一、核心逻辑梳理:为什么 Ubuntu 用 APT 而非直接用 dpkg?)

二、软件源配置(/etc/apt/sources.list)补充

三、核心命令对比与常见场景

[四、常见问题解决(结合你的 "网络问题处理" 延伸)](#四、常见问题解决(结合你的 “网络问题处理” 延伸))

五、实用技巧(提升效率)

[4. shell基本命令](#4. shell基本命令)

[一、Shell 本质与核心作用](#一、Shell 本质与核心作用)

[二、Shell 命令核心技巧](#二、Shell 命令核心技巧)

[1. 命令补全进阶](#1. 命令补全进阶)

[2. 历史命令高级用法](#2. 历史命令高级用法)

[3. 命令组合与管道](#3. 命令组合与管道)

三、关机与重启命令详解

[1. shutdown vs reboot vs poweroff](#1. shutdown vs reboot vs poweroff)

[2. 定时关机示例](#2. 定时关机示例)

[四、Shell 脚本入门(对应你提到的 "难" 知识点)](#四、Shell 脚本入门(对应你提到的 “难” 知识点))

五、常见问题与解决

六、知识强化建议

[5. Shell中的特殊字符(上)](#5. Shell中的特殊字符(上))

[一、Shell 通配符:批量操作的 "快捷键"](#一、Shell 通配符:批量操作的 “快捷键”)

[1. 通配符核心用法与实例](#1. 通配符核心用法与实例)

[2. 实战场景:从 "重复操作" 到 "一行搞定"](#2. 实战场景:从 “重复操作” 到 “一行搞定”)

(1)批量创建文件

(2)精准删除文件(避免误删)

(3)筛选特定文件

[3. 避坑指南](#3. 避坑指南)

[二、管道(|):命令协作的 "传送带"](#二、管道(|):命令协作的 “传送带”)

[1. 管道工作原理](#1. 管道工作原理)

[2. 高频管道组合实战](#2. 高频管道组合实战)

(1)文本筛选与统计

(2)日志分析(按关键词过滤)

(3)多级管道:复杂筛选

[3. 管道避坑指南](#3. 管道避坑指南)

[三、通配符与管道的 "组合技"](#三、通配符与管道的 “组合技”)

实战案例:清理过期日志

四、知识小结与实战建议

[6. Shell中的特殊字符(下)](#6. Shell中的特殊字符(下))

[一、输入输出重定向:数据流向的 "控制器"](#一、输入输出重定向:数据流向的 “控制器”)

[1. 三大标准流与重定向符](#1. 三大标准流与重定向符)

[2. 重定向核心用法与实战](#2. 重定向核心用法与实战)

(1)输出重定向:保存结果到文件

(2)输入重定向:从文件获取输入

[3. 重定向避坑指南](#3. 重定向避坑指南)

[二、命令置换:动态参数的 "传递器"](#二、命令置换:动态参数的 “传递器”)

[1. 两种语法与区别](#1. 两种语法与区别)

[2. 命令置换实战场景](#2. 命令置换实战场景)

[(1)动态获取路径 / 时间](#(1)动态获取路径 / 时间)

(2)嵌套使用:多层命令结果传递

(3)替代手动输入,避免错误

[3. 命令置换避坑指南](#3. 命令置换避坑指南)

[三、重定向与命令置换的 "组合技"](#三、重定向与命令置换的 “组合技”)

实战案例:自动生成日志报告

四、知识小结与练习建议


Day10

1. Linux 软件包管理:从机制到实操的完整指南

软件包管理是 Linux 系统使用的核心技能,它解决了 "如何高效安装、卸载和管理软件" 的问题。本文以 Debian/Ubuntu 系统为例,详解两种主流包管理机制、核心工具(dpkgAPT)及实操技巧,帮助快速掌握软件管理流程。

一、主流软件包管理机制对比

Linux 系统的软件包管理机制主要分为两类,核心差异在于包格式和依赖处理方式:

1. Debian 软件包机制(.deb)
  • 提出者:Debian Linux 首创;

  • 核心特点:

    • 将二进制文件、配置文件、帮助文档等打包为.deb格式;

    • 通过工具自动完成安装、卸载、查询等操作;

  • 应用系统:Ubuntu、Debian 等(课程重点,使用最广泛)。

2. RPM 软件包机制(.rpm)
  • 提出者:Red Hat 基于 Debian 理念开发;

  • 核心特点 :功能与.deb类似,但文件格式不同;

  • 应用系统:Red Hat、CentOS 等红帽系列发行版。

3. APT 工具的核心价值(Debian 系优势)
  • 开发背景:解决软件包之间的 "依赖地狱"(如安装 A 需要先安装 B,安装 B 需要先安装 C);

  • 核心功能:

    • 自动检测并安装依赖的软件包;

    • 从网络仓库(而非本地文件)获取软件;

  • 优势:大幅降低操作复杂度,成为 Debian 系的标志性工具。

二、软件包的类型与识别

根据使用方式,软件包分为两类,需根据需求选择:

1. 二进制软件包(推荐新手使用)
  • 文件格式.deb(如sl_3.03-16_i386.deb);

  • 包含内容:已编译的可执行文件、库文件、配置文件等(无需编译,直接安装);

  • 适用场景:快速使用软件(如安装浏览器、编辑器)。

2. 源码包(开发者 / 高级用户使用)
  • 文件格式.deb-src

  • 包含内容:源代码、编译脚本、版本说明(需手动编译后才能安装);

  • 适用场景:需要修改源码、定制功能或学习软件实现。

3. 类型识别方法

通过file命令查看文件类型:

复制代码
file sl_3.03-16_i386.deb
# 输出:sl_3.03-16_i386.deb: Debian binary package (format 2.0)

三、软件包命名规则(必学,避免装错版本)

1. 命名格式(固定结构)
复制代码
软件包名_版本号-修订版本_体系架构.deb
  • 示例:

    复制代码
    sl_3.03-16_i386.deb
    • sl:软件包名称(程序名);

    • 3.03:软件版本号(核心版本);

    • 16:修订版本(修复 bug 的小更新);

    • i386:体系架构(适用的 CPU 类型,如amd64对应 64 位)。

2. 常见架构标识
标识 含义
i386 32 位 x86 架构 CPU
amd64 64 位 x86 架构 CPU(主流)
arm64 ARM 架构(嵌入式设备)

四、软件包管理工具(重点:命令行工具)

Linux 提供三类工具,命令行工具是基础且必须掌握的:

工具类型 代表工具 特点与适用场景 优先级
命令行工具 dpkgapt 高效、脚本化操作(服务器 / 远程管理必备) 最高
文本窗口界面 aptitude 菜单操作,适合终端新手 中等
图形界面工具 synaptic 鼠标点击操作(桌面用户) 最低

五、dpkg命令:底层包管理工具(核心)

dpkg是 Debian 系的底层工具,直接操作本地.deb文件(不处理网络下载和依赖)。

1. 常用命令(参数与功能对应)
命令 功能描述 示例
sudo dpkg -i <包名> 安装本地.deb包(需完整文件名) sudo dpkg -i sl_3.03-16_i386.deb
sudo dpkg -r <包名> 移除软件包(保留配置文件) sudo dpkg -r sl
sudo dpkg -P <包名> 彻底移除(含配置文件) sudo dpkg -P sl
dpkg -L <包名> 列出软件包安装的所有文件 dpkg -L sl
dpkg -s <包名> 查看软件包安装状态(是否已安装) dpkg -s sl
  • 记忆技巧 :参数首字母对应英文单词(i=install,r=remove)。
2. 实操注意事项
  • 权限 :安装 / 移除需要管理员权限(加sudo),密码输入时不显示字符是正常现象;

  • 包名规则:

    • 安装时必须用完整文件名(如sl_3.03-16_i386.deb);

    • 其他操作只需软件名(如sl,无需.deb后缀);

  • 依赖问题dpkg不会自动安装依赖,若提示 "缺少依赖",需手动解决(后续APT工具可自动处理)。

六、APT工具:解决依赖的 "智能管家"

APT(Advanced Package Tool)是建立在dpkg之上的高层工具,核心优势是自动处理依赖从网络仓库下载软件

1. 核心功能
  • 从官方仓库(网络)获取软件包;

  • 自动检测并安装依赖的软件(如安装 A 时自动安装 A 依赖的 B 和 C);

  • 集中管理软件源(/etc/apt/sources.list)。

2. 常用APT命令(对比dpkg
命令 功能描述 优势
sudo apt update 更新软件源索引(获取最新包信息) 确保安装的是最新版本
sudo apt install <包名> 安装软件(自动解决依赖) 无需手动下载.deb,自动处理依赖
sudo apt remove <包名> 移除软件(保留配置) dpkg -r更智能(提示相关依赖)
sudo apt purge <包名> 彻底移除(含配置) 等价于dpkg -P,但支持批量操作
apt search <关键词> 搜索软件包(根据名称 / 描述) 无需知道完整包名
3. dpkgAPT的分工(核心区别)
工具 操作对象 依赖处理 网络支持 典型场景
dpkg 本地.deb文件 不处理(需手动) 安装下载好的本地包(如第三方软件)
APT 网络仓库 自动处理 日常安装、更新软件(推荐使用)

七、常见问题与解决技巧

1. 权限不足
  • 错误提示requires superuser privilege(需要管理员权限);

  • 解决 :命令前加sudo(如sudo apt install sl)。

2. 依赖缺失(dpkg安装时)
  • 错误提示depends on xxx; but it is not installed

  • 解决 :用APT修复依赖:sudo apt -f install(自动安装缺失的依赖)。

3. 包名记不全
  • 技巧 :输入部分名称后按Tab键自动补全(如输入sl后按Tab,若有多个匹配会列出所有选项)。
4. 软件安装后找不到
  • 排查 :用dpkg -L <包名>查看安装路径(如dpkg -L sl可看到/usr/games/sl);

  • 解决 :若在/usr/games等目录,直接输入程序名运行(如sl)。

八、知识小结

知识点 核心内容 考试重点 / 易混淆点 难度系数
包管理机制 Debian(.deb + APT)和 RPM(.rpm);APT 自动解决依赖 APT 与dpkg的分工(高层 vs 底层);依赖处理差异 ⭐⭐
软件包类型 二进制包(.deb,直接安装)和源码包(.deb-src,需编译);file命令识别类型 两类包的使用场景(新手用二进制,开发者用源码) ⭐⭐
命名规则 软件名版本 - 修订版 架构(如sl_3.03-16_i386.deb);架构字段含义(i386/amd64) 版本号与修订版的区别;根据架构选择合适的包 ⭐⭐
dpkg命令 -i安装、-r移除、-P彻底清除;需完整文件名(安装时) 操作对象(本地包);权限要求(sudo);依赖问题处理 ⭐⭐⭐
APT命令 install安装、remove移除、update更新源;自动解决依赖 apt installdpkg -i的区别;update(更新索引)与upgrade(更新软件)的区别 ⭐⭐⭐

九、学习建议

  1. 优先掌握APT :日常使用中,sudo apt install <包名>sudo apt remove <包名>能解决 90% 的需求;

  2. dpkg作为补充 :仅在安装本地下载的.deb包时使用(如第三方软件),遇到依赖问题用apt -f install修复;

  3. 实践记忆 :通过安装趣味包(如sl------ 输错ls时显示火车动画)熟悉命令,比死记硬背更有效;

  4. 软件源更新 :新系统首次使用前,先执行sudo apt update更新源索引,确保能获取最新软件。

软件包管理是 Linux 系统使用的基础技能,熟练掌握后能高效部署和维护系统,后续学习服务器配置、开发环境搭建都会更轻松。

2. Linux 软件包管理工具全解析(Debian/Ubuntu 体系)

软件包管理是 Linux 系统使用的核心技能,掌握dpkgAPT工具能高效解决软件的安装、卸载与维护问题。本文从包管理机制到命令实操,系统梳理相关知识,帮助快速上手。

一、两大软件包管理机制对比

Linux 系统的软件包管理主要分为两类,核心差异体现在包格式和依赖处理:

机制类型 提出者 包格式 代表工具 应用系统 核心优势
Debian 机制 Debian Linux .deb dpkgAPT Ubuntu、Debian APT 工具自动解决依赖关系
RPM 机制 Redhat Linux .rpm rpmyum Red Hat、CentOS 企业级稳定性,适合服务器环境

关键区别 :Debian 系的APT工具能自动检测并安装依赖软件,而早期 RPM 需手动处理依赖(现代yum/dnf已优化)。

二、软件包的两种类型(按使用方式划分)

1. 二进制软件包(.deb)
  • 特点 :已编译完成,下载后可直接安装(类似 Windows 的.exe);

  • 包含内容 :可执行文件(如/usr/bin/sl)、配置文件(如/etc/sl.conf)、帮助文档(man手册);

  • 适用人群:普通用户(无需编程知识,直接使用)。

2. 源码包(.deb-src)
  • 特点 :包含源代码(如.c文件),需编译后才能安装;

  • 包含内容 :源码、编译脚本(Makefile)、版本说明;

  • 适用人群:开发者(需修改功能)、高级用户(需定制编译参数)。

3. 类型识别方法

通过file命令查看文件属性:

复制代码
# 查看二进制包
file sl_3.03-16_i386.deb
# 输出:Debian binary package (format 2.0)
​
# 查看源码包
file xxx.deb-src
# 输出:Debian source package

三、软件包命名规则(快速识别关键信息)

所有.deb包遵循统一命名格式,掌握规则可避免安装错误版本:

复制代码
软件包名_版本号-修订版本_架构.deb
实例解析:rxvt_1%3a2.6.4-14_i386.deb
  • rxvt:软件包名称(程序名,操作时用此名称);

  • 2.6.4:核心版本号(主程序版本);

  • 14:修订版本(修复 bug 的小更新次数);

  • i386:适用架构(i386=32 位 CPU,amd64=64 位 CPU)。

常见架构标识
标识 对应硬件 现代主流
i386 32 位 x86 架构(旧电脑) ❌ 逐渐淘汰
amd64 64 位 x86 架构(笔记本 / 台式机) ✅ 主流
arm64 ARM 架构(手机 / 嵌入式设备) ✅ 嵌入式

四、软件包管理工具(按使用界面分类)

1. 三类工具对比
工具类型 代表工具 操作方式 适用场景 学习优先级
命令行工具 dpkgapt 输入命令 服务器、远程操作、脚本自动化 最高
文本窗口工具 aptitude 键盘导航菜单 无图形界面的终端环境 中等
图形界面工具 synaptic 鼠标点击 桌面用户(如 Ubuntu 图形界面) 最低
核心工具:dpkg(底层)和apt(高层)
  • dpkg:直接操作本地.deb包,不处理网络和依赖;

  • apt:基于dpkg,从网络仓库下载软件,自动解决依赖。

五、dpkg命令实操(本地包管理)

dpkg是 Debian 系的基础工具,负责本地.deb包的安装、卸载等操作,需手动处理依赖。

常用命令速查表(参数对应功能)
命令 功能 示例 注意事项
dpkg -i <包名> 安装本地.deb sudo dpkg -i sl_3.03-16_i386.deb 需完整文件名(含.deb),加sudo
dpkg -r <包名> 移除软件(保留配置) sudo dpkg -r sl 只需软件名(如sl
dpkg -P <包名> 彻底移除(含配置文件) sudo dpkg -P sl 适用于完全清理软件
dpkg -L <包名> 列出安装的所有文件 dpkg -L sl 查看软件安装路径
dpkg -s <包名> 查看软件状态(是否已安装) dpkg -s sl 输出 "install ok installed" 为已安装
实操注意事项
  1. 权限问题 : 安装 / 卸载需管理员权限,提示requires superuser privilege时,命令前加sudo(如sudo dpkg -i ...)。

  2. 包名格式:

    • 安装时必须输入完整文件名(如sl_3.03-16_i386.deb);

    • 其他操作只需软件名(如sl)。

  3. 依赖报错处理 : 若安装时提示 "缺少 xxx 依赖",需手动下载安装依赖包(后续apt工具可自动解决)。

六、aptdpkg的核心区别(必懂)

对比维度 dpkg apt
操作对象 本地.deb文件(需手动下载) 网络仓库(自动下载)
依赖处理 不处理,需手动解决 自动检测并安装所有依赖
网络支持 无(仅本地操作) 有(从软件源获取包)
典型使用场景 安装第三方本地包(如官网下载的.deb) 日常安装、更新软件(如apt install firefox

形象类比dpkg像 "手动组装家具"(需自己找零件),apt像 "全屋定制"(自动送货 + 组装)。

七、常见问题与解决技巧

  1. sudo密码输入不显示: 正常现象,输入后按回车即可(Linux 为安全隐藏输入)。

  2. 命令补全 : 输入部分文件名或包名后按Tab键,自动补全(如输入sl_后按Tab)。

  3. 15 分钟内免重复输密码sudo权限在 15 分钟内有效,重复操作无需再次输入密码。

  4. 误操作恢复 : 若用dpkg -r误删软件,重新安装即可(配置文件未删,恢复后保留设置)。

八、知识小结

知识点 核心考点 易混淆点
软件包管理机制 Debian(.deb + APT)与 RPM 的区别;APT 自动解决依赖 APT 与dpkg的分工(高层管理 vs 底层执行)
软件包类型 二进制包(直接用)与源码包(需编译)的区别;file命令的使用 源码包的安装流程(需编译,而非直接安装)
dpkg命令 -i/-r/-P的功能;包名格式要求(安装用全称,其他用简称) 权限不足的解决(加sudo);依赖报错的临时处理
aptdpkg对比 apt的网络支持和依赖处理优势;dpkg的本地包操作特性 何时用dpkg(本地包) vs 何时用apt(网络安装)

掌握dpkgapt后,可应对 Ubuntu 系统 90% 以上的软件管理需求,后续学习服务器配置或开发环境搭建将更高效。

3. Linux 软件包管理工具全解析(Debian/Ubuntu 体系)→补充

一、核心逻辑梳理:为什么 Ubuntu 用 APT 而非直接用 dpkg?

  • dpkg 是 deb 包的底层工具(类似 "解压缩 + 文件复制"),但无法自动处理依赖(比如安装 A 需要先装 B,dpkg 会直接报错)。

  • APT 是在 dpkg 基础上的 "智能管家":通过软件源索引知道 "哪些包依赖什么",自动下载并按顺序安装,解决了 dpkg 的核心痛点。

  • 简单说:dpkg 适合本地 deb 包安装,APT 适合从仓库安装 / 升级(自动处理依赖)

二、软件源配置(/etc/apt/sources.list)补充

  • 文件格式示例 (你提到的 "文件格式" 可补充): 一行对应一个软件源,格式为: deb [arch=amd64] http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse

    • deb:表示二进制包(用户直接用),deb-src表示源代码包(需编译)

    • jammy:Ubuntu 版本代号(22.04 对应 jammy,20.04 对应 focal)

    • 最后四个单词即你提到的 "Main/Universe/Restricted/Multiverse" 分类

  • 国内镜像选择建议 : 优先选距离近的镜像 (如北方用 163,南方用阿里云),或通过software-properties-gtk(图形化工具)自动选择 "最佳服务器"。

三、核心命令对比与常见场景

需求 推荐命令 注意事项
安装软件 sudo apt install <包名> apt-get install更简洁(推荐新用法)
彻底卸载(含配置) sudo apt purge <包名> 等同于apt-get --purge remove
升级系统(含内核) sudo apt full-upgrade upgrade更彻底(会删除旧依赖 / 升级内核)
清理无用依赖 sudo apt autoremove 避免 "卸载 A 后,A 的依赖 B 留在系统"
本地 deb 包安装 sudo dpkg -i <xxx.deb> 若依赖报错,用apt -f install修复

四、常见问题解决(结合你的 "网络问题处理" 延伸)

  1. 更新时 "无法解析域名"

    • 检查/etc/resolv.conf是否有 DNS(如nameserver 8.8.8.8,谷歌公共 DNS)。

    • 若用虚拟机,NAT 模式下确保宿主机能联网。

  2. 依赖错误 "有未能满足的依赖关系"

    • 先执行apt update刷新索引,再用apt -f install自动修复。

    • 若仍报错,可能是软件源版本不匹配(如用了 20.04 的源在 22.04 系统)。

  3. 误删软件源配置文件

    • 可从 Ubuntu 官方镜像站复制对应版本的sources.list模板,或通过图形化工具(software-properties-gtk)重新生成。

五、实用技巧(提升效率)

  • ** apt 与 apt-get 的区别 **: apt是 Ubuntu 16.04 后推出的 "简化版",合并了apt-getapt-cache的功能(如apt show替代apt-cache show),输出更友好,推荐日常使用。

  • 搜索软件包 : 不知道包名时,用apt search <关键词>(如apt search text-editor搜索文本编辑器)。

  • 查看已安装包apt list --installed(配合grep筛选,如apt list --installed | grep python)。

通过这些内容,能更清晰理解 "Ubuntu 如何通过 APT 高效管理软件"------ 核心是 "集中仓库 + 自动依赖处理",而命令只是实现工具,重点是掌握 "遇到问题时如何排查(如先查网络→再查源→最后修依赖)" 的逻辑。

4. shell基本命令

一、Shell 本质与核心作用

  1. 为什么 Shell 是 Linux 的灵魂?

    • Shell 不仅是命令解释器,更是自动化工具脚本语言。通过 Shell 脚本,可将复杂操作简化为一行命令(如批量备份、定时任务)。

    • 类比:如果说 Linux 内核是 "发动机",Shell 就是 "方向盘",用户通过它控制整个系统。

  2. Shell vs 图形界面(GUI)

    场景 Shell 优势 GUI 优势
    批量操作 脚本自动化(如批量重命名文件) 直观但需重复点击
    远程管理 仅需 SSH 连接即可操作 需图形化远程桌面,占用带宽
    精确控制 支持正则表达式、管道等精确匹配 依赖菜单选项,灵活性低
    系统级操作 直接执行底层命令(如修改内核参数) 部分操作受限制(如编辑 /etc)

二、Shell 命令核心技巧

1. 命令补全进阶
  • TAB 键 vs ESC 键 : TAB 键:优先补全已存在的命令或文件名(如输入ls /etc/ap后按 TAB 补全为ls /etc/apt); ESC 键:可补全命令别名(如ll补全为ls -al),但需配置~/.inputrc文件。

  • 高级补全 : 在 Bash 中,按Ctrl+X再按Ctrl+F可弹出文件名补全菜单,支持模糊匹配(如输入f*e补全以 f 开头、e 结尾的文件)。

2. 历史命令高级用法
  • 快速复用历史命令!!:执行上一条命令(如忘记加 sudo 时,直接输入sudo !!); !n:执行历史记录第 n 条命令(如!100执行第 100 条命令); !string:执行最近一条以 string 开头的命令(如!ls执行最近的 ls 命令)。

  • 历史命令搜索 : 按Ctrl+R进入反向搜索模式,输入关键词快速定位历史命令(如搜shutdown找到关机命令)。

3. 命令组合与管道
  • 分号(;) :顺序执行多个命令(如ls; cd ~; pwd);

  • 双与(&&) :前一个命令成功才执行下一个(如sudo apt update && sudo apt upgrade);

  • 管道(|) :将前一个命令的输出作为后一个命令的输入(如ls -l | grep .txt筛选 txt 文件)。

三、关机与重启命令详解

1. shutdown vs reboot vs poweroff
命令 底层原理 推荐场景 等价命令
shutdown 调用systemd关机,支持定时 常规关机 / 重启,需通知用户 systemctl poweroff
reboot 直接调用内核重启 开发板调试、紧急重启 systemctl reboot
poweroff 直接调用内核关机 无需通知的快速关机 systemctl halt
2. 定时关机示例
  • 45 分钟后关机并发送通知:

    复制代码
    sudo shutdown -h +45 "系统将在45分钟后关机,请保存工作"
  • 指定时间关机(如 20:30):

    复制代码
    sudo shutdown -h 20:30
  • 取消关机计划:

    复制代码
    sudo shutdown -c

四、Shell 脚本入门(对应你提到的 "难" 知识点)

  1. 为什么需要 Shell 脚本? 例:批量创建 100 个用户并分配密码,手动敲命令需 100 次,脚本只需 1 行:

    复制代码
    # 创建user1到user100的用户
    for i in $(seq 1 100); do
        useradd -m user$i
        echo "user$i:password" | chpasswd
    done
  2. 基础语法

    • 变量name="doubao"; echo $name

    • 条件判断:

      复制代码
      if [ $num -gt 10 ]; then
          echo "大于10"
      else
          echo "小于等于10"
      fi
    • 循环:

      复制代码
      for file in $(ls); do
          echo "处理文件: $file"
      done
  3. 执行脚本

    复制代码
    # 赋予执行权限
    chmod +x script.sh
    # 执行
    ./script.sh

五、常见问题与解决

  1. 命令找不到?

    • 检查 PATH 环境变量:echo $PATH,确认命令所在目录(如/usr/bin)是否在 PATH 中;

    • 若刚安装的命令,尝试source ~/.bashrc刷新环境变量。

  2. 权限不足?

    • 普通用户执行 root 命令:加 sudo(如sudo apt install);

    • 若 sudo 也报错,可能用户不在 sudoers 组,需 root 用户执行usermod -aG sudo your_username

  3. 命令输出乱码? 设置终端字符编码为 UTF-8:export LANG=en_US.UTF-8(临时)或修改~/.bashrc(永久)。

六、知识强化建议

  1. 每日练习 : 每天用 10 分钟练习 5 个命令(如findgrepawk),记录使用场景。

  2. 脚本实战: 从简单脚本开始(如备份日志、清理临时文件),逐步增加复杂度。

  3. 参考手册 : 遇到陌生命令,先看man手册(如man ls),重点关注 EXAMPLES 部分。

  4. 善用社区: Stack Overflow、Ask Ubuntu 等社区搜索问题,学习他人的解决方案。

5. Shell中的特殊字符(上)

一、Shell 通配符:批量操作的 "快捷键"

通配符的核心是 "用符号匹配文件名 / 路径",避免逐个输入,适合批量创建、删除、筛选文件。

1. 通配符核心用法与实例
通配符 功能描述 实战示例 注意事项
* 匹配任意长度字符(包括 0 个) ls file* → 匹配 file、file1、file.txt 等 避免在rm *中滥用(易误删)
? 匹配单个任意字符 ls file? → 匹配 file1、filea(不匹配 file) 仅匹配 "长度差 1" 的文件(如 a? 匹配 ab,不匹配 a)
[abc] 匹配括号内单个指定字符 ls file[135] → 匹配 file1、file3、file5 字符无顺序([135] 和 [531] 效果相同)
[a-z] 匹配单个指定范围字符 ls [0-9].txt → 匹配 1.txt、5.txt 范围需连续(如 [a-c] 等价于 [abc])
[^abc] 匹配单个"非括号内" 字符 ls file[^12] → 匹配 file3、filea(排除 file1、file2) ^仅在[]内表示 "非",单独使用无意义
2. 实战场景:从 "重复操作" 到 "一行搞定"
(1)批量创建文件
复制代码
# 需求:创建file1.txt、file2.txt、file3.txt
touch file{1,2,3}.txt  # 等价于touch file1.txt file2.txt file3.txt({}是扩展通配符)
​
# 需求:创建2023-01.log到2023-12.log
touch 2023-{01..12}.log  # {start..end}生成连续序列(bash特有)
(2)精准删除文件(避免误删)
复制代码
# 需求:删除所有.txt文件,但保留readme.txt
rm *.txt && mv readme.txt.bak readme.txt  # 先删后恢复(笨方法)
# 更优:用[^]排除
rm [^r]*.txt  # 排除以r开头的.txt文件(即保留readme.txt)
(3)筛选特定文件
复制代码
# 需求:查看当前目录中“以数字开头、.sh结尾”的脚本
ls [0-9]*.sh  # 匹配1.sh、23_test.sh等
3. 避坑指南
  • 通配符≠正则表达式 : 通配符仅用于匹配文件名(如*匹配任意字符),正则表达式用于匹配文本内容(如.*匹配任意字符串),二者语法不同(如正则中*表示 "前一个字符重复 0 次以上")。

  • rm \*的风险 : 执行前先用ls *预览匹配结果,确认无误再删除;重要文件可先备份到~/backup目录。

  • 范围匹配的边界[a-z]仅匹配小写字母(不包含大写),[0-9a-zA-Z]可匹配数字和大小写字母(适合匹配混合命名的文件)。

二、管道(|):命令协作的 "传送带"

管道的核心是 "将前一个命令的输出,直接传给后一个命令作为输入",实现 "多步骤操作流水线",无需临时文件中转。

1. 管道工作原理
  • 数据流方向命令A | 命令B | 命令C → 命令 A 的输出 → 命令 B 处理 → 命令 B 的输出 → 命令 C 处理 → 最终结果

  • 类比:像工厂流水线 ------"原材料(A 的输出)→加工(B)→再加工(C)→成品"。

2. 高频管道组合实战
(1)文本筛选与统计
复制代码
# 需求:统计系统中“以bash为默认shell”的用户数量
cat /etc/passwd | grep "bash$" | wc -l
# 拆解:
# 1. cat /etc/passwd:读取用户信息文件
# 2. grep "bash$":筛选行尾为bash的用户($表示行尾,精准匹配)
# 3. wc -l:统计行数(即用户数量)
(2)日志分析(按关键词过滤)
复制代码
# 需求:从nginx日志中,统计“404错误”的请求数量
cat /var/log/nginx/access.log | grep " 404 " | wc -l
# 注:日志中404前后有空格,用" 404 "避免匹配包含404的URL(如page404.html)
(3)多级管道:复杂筛选
复制代码
# 需求:查找当前目录中“大于100KB、且包含关键词error”的.log文件
ls -l *.log | grep -v "total" | awk '$5 > 102400' | awk '{print $9}' | xargs grep "error"
# 拆解:
# 1. ls -l *.log:列出log文件详细信息(含大小)
# 2. grep -v "total":排除总大小行(-v表示反向匹配)
# 3. awk '$5 > 102400':筛选第5列(文件大小)大于100KB(102400字节)的行
# 4. awk '{print $9}':提取第9列(文件名)
# 5. xargs grep "error":对每个文件名执行grep,查找error关键词
3. 管道避坑指南
  • 管道与重定向(>)的区别

    • 管道(|):传递 "数据" 给下一个命令处理(如grep筛选);

    • 重定向(>):将数据 "保存" 到文件(如ls > file.txt)。 例:ls | grep txt是筛选文件,ls > txt.list是保存文件列表。

  • 管道不传递错误信息 : 若前一个命令报错(如ls nofile | wc -l),错误提示会直接显示在终端,不会传给后一个命令(后命令统计的是正确输出,此处结果为 0)。

  • 避免无意义的管道 : 如cat file.txt | grep "abc"可简化为grep "abc" file.txt(grep 直接支持读取文件,无需 cat 中转),减少不必要的性能消耗。

三、通配符与管道的 "组合技"

两者结合可实现 "批量筛选 + 精准处理",是 Shell 高效操作的核心逻辑。

实战案例:清理过期日志
复制代码
# 需求:删除“/var/log/”中“30天前、以.log结尾、且大小超过1MB”的日志
find /var/log/ -name "*.log" -mtime +30 -size +1M | xargs rm -f
# 拆解:
# 1. find ... "*.log":用通配符匹配log文件
# 2. -mtime +30:筛选30天前的文件;-size +1M:筛选大于1MB的文件
# 3. xargs rm -f:将find找到的文件名传给rm,批量删除
  • 安全提示 :执行删除前,先用echo替换rm -f预览效果: find ... | xargs echo → 确认文件名无误后再执行删除。

四、知识小结与实战建议

知识点 核心价值 练习方向
通配符 批量匹配文件名,减少重复操作 touch创建一批文件,再用ls+ 通配符筛选
管道 串联命令处理数据,实现复杂操作 分析系统日志(如/var/log/syslog),统计关键词出现次数
组合使用 批量筛选 + 精准处理,替代 GUI 重复操作 写一个 "清理临时文件" 的命令链(如 `ls /tmp/*.tmp -l grep "7 days ago" xargs rm`)

关键心态 :通配符和管道的核心是 "用规则替代重复劳动 ",初期可先记常用组合(如ls *.txt | wc -l统计 txt 文件数),再逐步扩展到复杂场景。遇到不确定的匹配结果,先用echols预览,避免误操作(尤其是rm等危险命令)。

6. Shell中的特殊字符(下)

一、输入输出重定向:数据流向的 "控制器"

Linux 中所有输入输出都通过 "标准流 " 传递(默认是键盘和终端),重定向的本质是 "改变这些流的目标"(如文件、其他命令)。

1. 三大标准流与重定向符
标准流 编号 默认目标 作用 常用重定向符
标准输入(STDIN) 0 键盘 命令接收的输入(如read命令) <(从文件读入)
标准输出(STDOUT) 1 终端窗口 命令的正常输出(如ls结果) >(覆盖写入)、>>(追加写入)
标准错误(STDERR) 2 终端窗口 命令的错误提示(如 "文件不存在") 2>(错误写入)、2>>(错误追加)
  • 为什么要区分 stdout 和 stderr? 正常输出(如日志内容)和错误信息(如报错)需要分开处理 ------ 比如把正确日志存到log.txt,错误存到error.log,方便后续排查问题。
2. 重定向核心用法与实战
(1)输出重定向:保存结果到文件
需求 命令示例 效果说明
覆盖写入(新建 / 清空) ls /usr > usr_list.txt ls结果写入usr_list.txt,原有内容被清空
追加写入(保留原有) date >> usr_list.txt usr_list.txt末尾添加当前时间(不影响原有内容)
输出 + 错误分开存 find / -name "*.conf" > conf.log 2> err.log 正确找到的配置文件存conf.log,权限错误等提示存err.log
输出 + 错误合并存 find / -name "*.conf" &> all.log 正确和错误信息都存入all.log&代表 "所有流")
  • 实战场景:调试程序时保存日志

    复制代码
    # 运行Python脚本,把打印结果和错误都存到日志
    python test.py > run.log 2>&1
    # 解释:2>&1 表示“把标准错误(2)重定向到标准输出(1)的目标”(即一起存入run.log)
(2)输入重定向:从文件获取输入
需求 命令示例 替代操作(默认输入)
统计文件行数 wc -l < test.txt 等价于wc -l test.txt(直接指定文件)
批量输入到命令 mysql -u root -p < init.sql init.sql中的 SQL 语句传给mysql执行(无需手动输入)
  • 核心价值:适合 "非交互式命令"------ 比如数据库初始化、脚本批量输入,避免手动敲键盘。
3. 重定向避坑指南
  • >的 "危险":避免误删文件 若不小心执行ls > important.txtimportant.txt原有内容会被覆盖! 解决:先用>>测试(即使错了也只是追加),或备份文件:cp important.txt important_backup.txt

  • 重定向符与文件名之间不能有空格 错误:ls > usr list.txt(会被解析为 "输出到usr,同时显示list.txt") 正确:ls > usr_list.txt(文件名连在一起)。

  • 合并输出的正确写法 想把 stdout 和 stderr 都存入同一文件,必须用2>&1(顺序不能反): 正确:command > all.log 2>&1(先定 stdout 目标,再让 stderr 跟随) 错误:command 2>&1 > all.log(stderr 会先指向终端,再改 stdout,导致错误没被存入)。

二、命令置换:动态参数的 "传递器"

命令置换(反引号或$())的核心是 "把一个命令的输出,作为另一个命令的参数",实现 "动态获取参数"(无需手动输入)。

1. 两种语法与区别
语法形式 示例 特点
反引号 lspwd`` → 列出当前目录内容 兼容性老,但嵌套时易混淆(如里再用需转义)
$() ls $(pwd) → 同上效果 推荐!支持嵌套(如$(ls $(pwd))),可读性好
  • 为什么推荐$() 反引号在复杂命令中容易和单引号混淆,且嵌套时需要转义(如echodate +%Y-date +%m`` 会报错),而()`可以自然嵌套:`echo (date +%Y-$(date +%m))`。
2. 命令置换实战场景
(1)动态获取路径 / 时间
复制代码
# 需求:在当前目录创建以“当前日期”命名的文件夹
mkdir $(date +%Y%m%d)  # 等价于mkdir 20240728(假设当天是2024-07-28)
​
# 需求:备份当前目录的文件到“backup_当前时间.tar”
tar -cvf backup_$(date +%H%M%S).tar *  # 生成如backup_153045.tar
(2)嵌套使用:多层命令结果传递
复制代码
# 需求:统计“/etc”目录下,名字包含“network”的文件数量
ls $(find /etc -name "*network*") | wc -l
# 拆解:
# 1. $(find ...):找到/etc下所有含network的文件路径
# 2. ls 这些路径:确认文件存在(过滤无效路径)
# 3. wc -l:统计最终有效文件数量
(3)替代手动输入,避免错误

比如部署程序时,需要用当前用户作为参数:

复制代码
# 错误:手动输入(若用户名变了会出错)
sudo chown username:username /app
​
# 正确:用命令置换动态获取当前用户
sudo chown $(whoami):$(whoami) /app  # $(whoami)返回当前用户名
3. 命令置换避坑指南
  • 反引号与单引号的区别 反引号是 "命令置换"(执行内部命令),单引号'是 "字符串原样输出"(不执行命令):

    复制代码
    echo `date`  # 输出当前时间(如2024年 07月28日)
    echo 'date'  # 输出字符串“date”(不执行命令)
  • 避免无意义的置换 若命令本身支持直接传文件,无需多此一举: 多余:cat $(echo "test.txt")(等价于cat test.txt) 合理:cat $(ls *.log | head -1)(动态取第一个 log 文件)。

三、重定向与命令置换的 "组合技"

两者结合可实现 "动态生成内容并定向存储",是 Shell 自动化脚本的核心逻辑。

实战案例:自动生成日志报告
复制代码
# 需求:生成包含“当前时间+系统磁盘使用情况+错误日志”的报告
echo "==== 报告生成时间:$(date) ====" > report.txt  # 写入时间(命令置换+覆盖)
df -h >> report.txt  # 追加磁盘使用情况(输出重定向)
echo "==== 错误日志 ====" >> report.txt
cat /var/log/syslog | grep "ERROR" >> report.txt  # 追加错误日志(管道+重定向)
  • 效果:report.txt中会按顺序保存时间、磁盘信息、错误日志,无需手动复制粘贴。

四、知识小结与练习建议

知识点 核心考点 练习方向
重定向符 >>>的区别(覆盖 vs 追加);2>的用法 写一个脚本,把ping baidu.com的成功结果存到ping.log,失败存到ping_err.log
标准流编号 2(stderr)的单独处理;2>&1的合并逻辑 ls nofile 2> err.log测试错误重定向,查看err.log内容
命令置换 $()的嵌套使用;与单引号的区别 写一个命令,创建以 "用户名 + 当前月份" 命名的文件夹(如mkdir $(whoami)_$(date +%m)
组合使用 管道 + 重定向 + 置换的协作(如grep $(date +%Y) log.txt > result.log 统计当前目录下所有.sh脚本的总行数,并把结果写入count.txt

掌握这些技巧后,你会发现 Shell 操作从 "逐个执行命令" 变成 "批量自动化处理",效率提升 10 倍以上。记住:多在实际场景中用(如整理日志、备份文件),比死记语法更有效

相关推荐
夕泠爱吃糖13 分钟前
Linux虚拟内存
linux·运维·服务器
Jooolin24 分钟前
Shell 是啥?PowerShell 又是什么?
linux·shell·ai编程
Jooolin35 分钟前
Linux指令和Windows的有啥不一样?咋用的?
linux·操作系统·ai编程
Chase_______41 分钟前
redis快速入门及使用
java·数据库·redis·学习·spring·缓存
阿群今天学习了吗43 分钟前
RNN、LSTM、Transformer推荐博文
人工智能·笔记·python·学习·算法
Linux技术支持工程师1 小时前
三十四、【Linux常用工具】rsync+inotify实时同步演示
linux·运维·服务器·学习·kylin
●VON1 小时前
重生之我在暑假学习微服务第五天《Docker部署项目篇》
java·学习·docker·微服务·云原生·架构·暑假
五行缺弦1 小时前
Java 笔记 封装(Encapsulation)
笔记
饭碗的彼岸one1 小时前
重生之我在10天内卷赢C++ - DAY 2
linux·开发语言·c++·笔记·算法·vim
梦在深巷@12 小时前
ica1靶机练习
linux·运维·服务器