本文是 Linux 入门学习的完整笔记。内容覆盖了从 Linux 背景介绍、环境搭建、常见指令,到权限管理、yum 软件安装的全过程。适合零基础的同学入门 Linux,也适合作为 C/C++ 后台开发学习路线中 Linux 基础知识的快速复习。


一、Linux 学习引言

为什么要学 Linux?

如果你做过一点开发相关的事情,一定经常听到 Linux 这个名字。你可能会问:我平时用的 Windows 挺好的,为什么还要学 Linux?

一句话回答:因为服务器上跑的大多是 Linux。

不管是你访问的网站、你用的 App 后台、还是云端的数据库,绝大多数都运行在 Linux 系统上。作为 C/C++ 开发者,我们的代码最终也是部署到 Linux 服务器上的——你不可能在 Windows 上写完了代码,连 Linux 长什么样都不知道。

Linux vs Windows

对比维度 Windows Linux
图形界面 必带,依赖图形界面操作 不是必须的,服务器版通常无图形界面
收费 收费(正版) 免费(开源)
稳定性和安全性 一般(病毒多) 高(服务器常年不重启是常态)
开发环境 IDE 集成开发 命令行 + 编辑器
软件安装 下载 .exe 双击安装 包管理器(yum/apt)命令行安装
权限管理 较弱(默认管理员权限) 严格(普通用户权限受限)
主要用途 个人桌面 服务器、嵌入式、云计算

Linux 在后台开发中的位置

学 C/C++ 后台开发,基本路线大致是这样的:

Linux 基础 → Linux 系统编程(进程/线程/网络) → 网络编程 → 数据库 → 项目实战

Linux 基础是这条路上的第一道门槛。如果你连 lscd、文件权限都不懂,后面学多进程、多线程、网络编程会非常吃力。所以打好基础非常关键。

本篇博客主要内容

  1. Linux 的背景和历史——了解一下"开源文化"
  2. 环境搭建——买云服务器、装 XShell、远程登录
  3. 常用命令——ls、cd、mkdir、rm、cp、mv 等(约 20 个命令)
  4. 文件查看——cat、more、less、head、tail
  5. 重定向和管道——>、>>、| 的用法
  6. Shell 工作原理——命令是怎么被执行的
  7. 权限管理——Linux 权限体系的来龙去脉
  8. yum 软件安装——安装、卸载、查找软件
  9. 常见错误和面试问题

二、Linux 背景介绍

2.1 UNIX 的历史

在讲 Linux 之前,必须先提 UNIX。

上世纪 60~70 年代,AT&T 贝尔实验室的 Ken Thompson 和 Dennis Ritchie 开发了 UNIX 操作系统。UNIX 的设计思想影响深远——它强调"一切皆文件"、"简单工具组合完成复杂任务"等理念,直到今天仍然是 Linux 的核心理念。

但 UNIX 是商业软件,源代码不开放,使用需要付费授权。

2.2 Linux 的诞生

1991 年,芬兰大学生 Linus Torvalds 在学习操作系统课程时,觉得当时的 MINIX(一个教学用类 UNIX 系统)不够好用。于是他决定自己写一个操作系统内核。

他在 comp.os.minix 新闻组发布了这样一条消息:

“Hello everybody out there using minix—I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu)…”

谁也没想到,这个"hobby"后来成了全世界最重要、最流行的操作系统内核。

2.3 Linux 和 UNIX 的关系

UNIX(商业闭源)
    ↑ 设计思想继承
Linux(开源免费)
    ↑ 受到 GNU 项目的支持和影响

Linux 不是 UNIX 的拷贝,而是类 UNIX 系统——它的设计思想、命令行接口、编程接口都和 UNIX 高度兼容,但代码是完全独立重写的。

2.4 Linux 内核 vs Linux 操作系统

这里要区分两个概念:

  • Linux 内核(kernel):真正管理硬件、调度进程、管理内存的那部分核心代码。Linus 写的就是这部分。
  • Linux 操作系统:内核 + 各种系统软件、工具、库。通常我们说的"安装 Linux"其实是安装一个发行版,它包含内核和大量其他软件。

2.5 GNU、GPL 和开源

GNU 是 Richard Stallman 发起的项目,目标是创建一个完全自由的 UNIX 兼容系统。GNU 贡献了大量的系统工具(gcc 编译器、bash shell、coreutils 等)。Linux 内核 + GNU 工具 = 一个完整的操作系统。

GPL(通用公共许可证)是 GNU 提出的开源协议,核心思想是:代码可以自由使用、修改、分发,但修改后的代码也必须开源。

2.6 Linux 常见发行版

发行版 特点 适用场景
Ubuntu 用户友好,软件新 个人开发、桌面
CentOS 稳定,企业级 服务器(RHEL 的免费版)
Red Hat Enterprise Linux (RHEL) 商业支持,稳定 企业生产环境
Debian 稳定,纯社区 服务器
Fedora 新技术最先用上 个人桌面
Arch Linux 滚动更新,高度可定制 进阶用户

课堂使用的是 CentOS(或基于 RHEL 的发行版),后续的 yum 命令也是针对 CentOS/RHEL 系列的。


三、Linux 环境搭建

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
课堂笔记:Linux 的历史发展脉络和三种环境搭建方式对比

学习 Linux 需要有实验环境。常见的方式有三种:

3.1 方式一:物理机安装

直接在电脑上装 Linux —— 双系统或者完全替代 Windows。

  • ✅ 性能最好
  • ❌ 日常使用不方便(很多软件只有 Windows 版)
  • ❌ 安装和配置复杂

3.2 方式二:虚拟机安装

在 Windows 上安装虚拟机软件(VMware / VirtualBox),再在里面安装 Linux。

  • ✅ 可以同时用 Windows 和 Linux
  • ✅ 不会影响宿主机系统
  • ❌ 比较吃内存和硬盘
  • ❌ 性能有损耗

3.3 方式三:云服务器安装(课堂推荐)

购买一台云服务器(阿里云 / 腾讯云 / 华为云),选择 CentOS 或 Ubuntu 镜像,通过 XShell 远程登录。

  • ✅ 环境稳定,配置统一
  • ✅ 可以远程访问,随时随地练习
  • ✅ 后续学网络编程、项目部署可以直接用这台服务器
  • ❌ 需要花钱(通常学生套餐很便宜——10~15 元/月)

课堂推荐使用云服务器,原因很实际:以后你要部署项目、做 Web 服务,迟早也要买服务器。现在买了,学习时练习用,学完了项目也部署在上面。

3.4 购买云服务器时需要关注什么

  1. 操作系统镜像:CentOS 7+ 或 Ubuntu 20.04+(建议 CentOS,课堂用的就是它)
  2. 公网 IP:购买后系统会分配一个公网 IP,这是你远程登录的地址
  3. root 用户 / root 密码:云服务器默认会创建一个 root 用户(最高权限用户),你要记住它的密码

四、使用 XShell 远程登录 Linux

4.1 为什么不用图形界面?

在实际开发中,服务器通常没有图形界面——没有显示器、没有鼠标、没有桌面环境。所有的操作都在命令行中完成。

为什么?因为:

  • 图形界面占用大量系统资源(CPU、内存、显卡)——服务器要把资源用来跑业务
  • 远程管理更高效——你只需要一个网络连接就能操作服务器
  • 自动化部署需要命令行——脚本批量操作

4.2 什么是 XShell

XShell 是一个远程终端工具,它通过 SSH 协议连接到你的 Linux 服务器,把服务器的命令行界面"搬"到你的 Windows 屏幕上。

类似工具还有:Putty、FinalShell、SecureCRT 等。XShell 免费版就够用了。

4.3 SSH 登录

打开 XShell,新建会话:

主机:  你的云服务器公网 IP(例如 123.456.789.0)
端口:  22(SSH 默认端口)

然后会弹出登录窗口,输入用户名和密码:

# 相当于在命令行执行:
ssh root@123.456.789.0
  • root:Linux 超级管理员账户
  • @:分隔用户和地址
  • 123.456.789.0:你的云服务器公网 IP

登录成功的标志是看到这样的提示符:

[root@localhost ~]#

各部分的含义:

  • root:当前登录的用户名
  • localhost:主机名(可以改名)
  • ~:当前目录是 root 的家目录 /root
  • #:超级管理员提示符

4.4 登录失败可能的原因

现象 可能原因 解决方式
连接超时 公网 IP 不对 / 服务器没开机 检查 IP 和服务器状态
连接被拒绝 SSH 服务没启动 / 端口不是 22 检查 SSH 服务状态
认证失败 密码不对 重置 root 密码
服务器不在安全组放行 22 端口 云服务器安全组规则限制 登录云控制台配置安全组

课堂小提示:在 XShell 中,复制是用 Ctrl+Insert,粘贴是用 Shift+InsertCtrl+CCtrl+V 在 XShell 中是发送中断信号和……什么也没有。刚开始不习惯是正常的,多用几次就好了。


五、Linux 基本认识

5.1 Linux 下一切皆文件

Linux 的设计哲学之一是 “Everything is a file”

这句话的意思是:在 Linux 中,普通文件、目录、设备(键盘、鼠标、硬盘)、网络连接、管道……都被抽象成了"文件"这个概念。你打开一个设备、读一个 Socket、写一个管道,系统调用(open/read/write/close)是统一的

这个设计让 Linux 的操作非常简洁和一致。

5.2 目录结构是一棵树

Linux 的目录结构是一棵倒挂的树,根是 /(根目录)。所有文件都在 / 下面。

一些重要的目录:

目录 用途
/ 根目录——整个文件系统的起点
/root root 用户的家目录
/home 普通用户的家目录(如 /home/zhangsan
/bin 存放常用命令(如 ls、cp)
/usr 存放系统软件和用户安装的软件
/etc 配置文件目录
/var 变动数据(日志等)
/tmp 临时文件(所有用户都可写)
/dev 设备文件
/lib 系统库文件
/proc 进程信息(伪文件系统)

5.3 绝对路径和相对路径

概念 说明 示例
绝对路径 从根目录 / 开始的完整路径 /home/user/test.txt
相对路径 相对于当前目录的路径 ../test.txt
当前目录 . 表示 ./a.txt 等价于当前目录下的 a.txt
上级目录 .. 表示 ../ 表示上一级目录
家目录 ~ 表示 cd ~ 回到当前用户的家目录
# 示例
pwd                    # 显示当前目录
cd /home               # 绝对路径切换到 /home
cd ..                  # 回到上级目录
cd ~                   # 回到家目录
cd -                   # 回到上一个工作目录

六、常见 Linux 指令详解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
课堂笔记:Linux 基础指令第一部分的整理

下面逐个讲解课堂上常用的 Linux 命令。每个命令我都会写出:命令作用 → 常见语法 → 常用选项 → 示例 → 易错点

6.1 ls —— 列出目录内容

语法ls [选项] [路径]

常用选项

选项 含义
-l 长格式显示(文件类型、权限、大小、修改时间等)
-a 显示所有文件,包括以 . 开头的隐藏文件
-h 以人类可读的方式显示大小(K、M、G)
-R 递归显示子目录内容
-t 按修改时间排序
ls                  # 列出当前目录的文件和目录名(简洁版)
ls -l               # 详细列表(常简写为 ll,很多系统上 ll 就是 ls -l 的别名)
ls -a               # 显示所有文件,包括 . 和 ..
ls -lh              # 显示大小(单位 K/M/G)
ls -la              # 列出所有文件的详细信息

ls -l 的输出示例:

-rw-r--r--  1 root root   1234 Mar 15 10:30 test.txt
drwxr-xr-x  2 root root   4096 Mar 15 10:31 mydir/

各字段含义:

  • 第 1 字符:文件类型(- 普通文件,d 目录,l 软链接)
  • 第 2~10 字符:权限(rwx)
  • 第 2 列:硬链接数
  • 第 3 列:拥有者(owner)
  • 第 4 列:所属组(group)
  • 第 5 列:大小(字节)
  • 第 6~8 列:最后修改时间
  • 第 9 列:文件名

💡 提示ll 在很多系统上是 ls -l 的别名,但不是所有 Linux 都默认有。如果 ll 不好使,用 ls -l

6.2 pwd —— 显示当前目录

pwd     # 显示当前所在的绝对路径

示例:

[root@localhost ~]# pwd
/root

每次 cd 到新目录后,不确定自己在哪时,就用 pwd 确认一下。

6.3 cd —— 切换目录

语法cd [路径]

cd /home          # 切换到 /home 目录
cd ..             # 切换到上级目录
cd ~              # 切换到当前用户的家目录
cd -              # 切换到上一个工作目录
cd /              # 切换到根目录
cd ./test         # 切换到当前目录下的 test 子目录

易错点cd 命令必须跟目录路径。如果你写 cd /home/user/test.txt(指向一个文件),会报错。

6.4 touch —— 创建文件或更新时间戳

touch file.txt          # 如果文件不存在,创建一个空文件
touch file.txt          # 如果文件已存在,更新文件的时间戳(不改变内容)
touch a.txt b.txt c.txt # 同时创建多个文件

💡 注意:刚学 Linux 时,touch 是你创建空文件最常用的命令。不用打开编辑器,直接 touch 文件名 就行。

6.5 mkdir —— 创建目录

语法mkdir [选项] 目录名

mkdir mydir                  # 创建单个目录
mkdir dir1 dir2 dir3         # 同时创建多个目录
mkdir -p a/b/c               # 递归创建多级目录(-p)

-p 选项非常实用——如果要创建的目录的父目录不存在,-p 会自动创建所有必要的父目录。如果没有 -pmkdir a/b/c 会报错(父目录 a 不存在)。

6.6 rmdir —— 删除目录

rmdir emptydir      # 删除一个空目录
rmdir -p a/b/c      # 递归删除空目录(c 删除后继续删 b 和 a)

易错点rmdir 只能删除空目录。如果目录非空(里面还有文件或子目录),会报错。实际工作中,删除非空目录更常用 rm -rf 目录名

6.7 rm —— 删除文件或目录

语法rm [选项] 目标

rm file.txt           # 删除文件(会有确认提示)
rm -f file.txt        # 强制删除(无确认提示)
rm -r mydir           # 递归删除目录(删除 mydir 及其所有内容)
rm -rf mydir          # 最常用的删除方式——递归 + 强制
rm -rf /              # ⚠️⚠️⚠️ 极度危险!!!删库跑路命令!!!

🚨 特别警告rm -rf / 是删除根目录下的所有内容。一旦执行,整个系统就废了。千万不要在任何服务器上尝试。 日常使用、练习时也要非常小心 rm -rf 的组合,确认目标路径后再回车。

6.8 man —— 查看帮助

man ls          # 查看 ls 命令的详细手册
man printf      # 查看 C 的 printf 函数说明
man 3 printf    # 查看第 3 章(库函数)中的 printf

man 是 Linux 下最强大的学习工具——任何命令不会用,man 命令名 就能看到它的完整文档。

在 man 页面中:

  • q 退出
  • ↑/↓j/k 上下翻页
  • /关键字 搜索
  • n 跳到下一个匹配项

💡 学习建议man 手册虽然是英文的,但这是你提升 Linux 能力最快的方式。刚开始看不习惯,坚持下去会越来越好。

6.9 cp —— 复制文件或目录

语法cp [选项] 源 目标

cp file1.txt file2.txt        # 将 file1 复制为 file2
cp file1.txt /home/user/      # 将 file1 复制到 /home/user/ 下
cp -r dir1 dir2               # 递归复制目录(复制 dir1 为 dir2)
cp -f file1 file2             # 强制覆盖(不提示确认)
# 课堂典型用法
touch test.txt
cp test.txt test_backup.txt   # 备份文件
mkdir backup
cp test.txt backup/           # 复制到目录中

易错点:复制目录时必须加 -r 选项。只写 cp dir1 dir2 会报错——“omitting directory”。

6.10 mv —— 移动或重命名

语法mv [选项] 源 目标

mv file.txt /home/user/       # 移动文件到指定目录
mv oldname.txt newname.txt    # 重命名(在同一目录下移动)
mv file.txt file2.txt /dir/   # 移动多个文件到 /dir/

mv 既可以移动文件,也可以重命名文件——核心逻辑就是一个"搬"字。不跨文件系统时,mv 只是修改目录项,比 cp 快得多。

6.11 cat —— 查看文件内容(小文件)

cat file.txt                 # 一次性显示文件全部内容
cat -n file.txt              # 显示行号
cat file1.txt file2.txt      # 拼接显示多个文件

易错点cat 适合小文件。如果文件很大(几千行),cat 会把所有内容刷屏到终端,你根本看不清。

6.12 more —— 分页查看(只能向下翻)

more bigfile.txt            # 分页显示,按空格翻下一页
more -5 bigfile.txt         # 每屏显示 5 行

more 的局限:只能向下翻页(按空格/回车),不能向上翻。这在实际使用中很不方便——如果你看漏了上一页的内容,没法往回翻。

6.13 less —— 更强力的分页查看

less bigfile.txt            # 分页显示,支持上下翻页

lessmore 灵活得多:

  • ↑/↓j/k:上下滚动一行
  • PgUp/PgDn空格/b:上下翻页
  • /关键字:搜索,按 n 跳到下一个
  • q:退出

💡 业界有句话:“Less is more.” 在功能上 less 确实比 more 更强。

6.14 head —— 查看文件开头

语法head [选项] 文件

head file.txt              # 默认显示前 10 行
head -n 5 file.txt         # 显示前 5 行
head -c 100 file.txt       # 显示前 100 个字节

6.15 tail —— 查看文件结尾

语法tail [选项] 文件

tail file.txt              # 默认显示后 10 行
tail -n 5 file.txt         # 显示后 5 行
tail -f file.txt           # 动态跟踪文件新增内容(最常用!)

tail -f 是最常用的调试命令之一。比如你的服务器正在跑一个 Web 程序,日志文件不断写入新内容,用 tail -f log.txt 可以实时看到最新的日志输出。

Ctrl+C 退出 tail -f

6.16 date —— 日期和时间

date                          # 显示当前时间
date +%Y-%m-%d                # 格式化显示:2024-03-15
date +"%Y-%m-%d %H:%M:%S"    # 自定义格式:2024-03-15 10:30:00
date -s "2024-03-15 10:30:00" # 设置系统时间(需要 root 权限)

6.17 cal —— 日历

cal               # 显示当月日历
cal 2024          # 显示 2024 年全年日历
cal 3 2000        # 显示 2000 年 3 月的日历

6.18 find —— 查找文件

语法find [路径] [选项]

find /home -name "test.txt"          # 在 /home 下按文件名查找
find / -name "*.log"                 # 查找所有 .log 文件
find / -size +100M                   # 查找大于 100MB 的文件
find / -name "*.cpp" -type f         # 只查找普通文件(不查目录)

6.19 grep —— 文件内容搜索

语法grep [选项] "模式" 文件

grep "hello" file.txt               # 在 file.txt 中搜索 "hello"
grep -r "main" /home/project/       # 递归搜索目录下的所有文件
grep -n "error" log.txt             # 显示匹配行及其行号
grep -i "hello" file.txt            # 忽略大小写
grep -v "hello" file.txt            # 反向匹配(显示不含 hello 的行)
grep "^error" log.txt               # 搜索以 error 开头的行
grep "fail$" log.txt                # 搜索以 fail 结尾的行

6.20 zip / unzip —— 压缩和解压

zip archive.zip file1.txt file2.txt   # 压缩两个文件
zip -r archive.zip mydir/             # 递归压缩目录
unzip archive.zip                     # 解压到当前目录
unzip archive.zip -d /home/user/      # 解压到指定目录

6.21 tar —— 打包和压缩

语法tar [选项] 打包名 文件

tar -cvf archive.tar file1 file2      # 打包(不压缩)
tar -czvf archive.tar.gz file1 file2  # 打包并 gzip 压缩(最常用)
tar -xzvf archive.tar.gz              # 解压 tar.gz 文件
tar -xjvf archive.tar.bz2             # 解压 tar.bz2 文件

各选项含义:

  • c:创建打包文件
  • x:解压
  • z:通过 gzip 压缩/解压(.tar.gz)
  • j:通过 bzip2 压缩/解压(.tar.bz2)
  • v:显示处理过程
  • f:指定打包文件名(必须放在选项最后

6.22 uname —— 查看系统信息

uname               # 显示内核名(Linux)
uname -a            # 显示所有系统信息(内核版本、主机名、架构等)
uname -r            # 只显示内核版本号

6.23 whoami —— 当前用户名

whoami              # 显示当前登录的用户名

如果当前是 root,输出 root;如果是普通用户 zhangsan,输出 zhangsan

6.24 clear —— 清屏

clear               # 清空终端屏幕

快捷键也是 Ctrl+L——效果和 clear 一样。


七、文件查看相关命令

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
课堂笔记:文件查看命令和更多基础指令的整理

上面已经介绍了 cat、more、less、head、tail 的单独用法。这里集中做一些对比和进阶使用。

7.1 cat vs more vs less 对比

命令 适用场景 优点 缺点
cat 小文件(几十行以内) 最直接,能和管道完美配合 大文件直接刷屏
more 较大文件 分页 不能向上翻页
less 大文件 / 需要搜索 上下翻页 + 搜索 命令行交互方式需要适应

7.2 head 和 tail 配合取中间某行

这是一个非常经典的用法——结合管道 |

# 取出文件的第 50 行
head -n 50 file.txt | tail -n 1

# 取出第 101~110 行
head -n 110 file.txt | tail -n 10

工作原理:

  1. head -n 110 取出前 110 行
  2. 通过管道 | 把结果传给 tail -n 10
  3. tail -n 10 从接收到的 110 行中取出最后 10 行 → 就是第 101~110 行

7.3 tail -f 查看动态日志

tail -f /var/log/messages       # 实时跟踪系统日志

这是排查服务器问题时最常用的命令之一。程序在运行时不断写入日志,你用 tail -f 实时看到每一条新日志。


八、重定向和管道

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
课堂笔记:重定向、管道、echo 等命令的课堂整理

8.1 三个标准流

Linux 启动一个程序时,默认会打开三个文件(流):

名称 文件描述符 默认去向
stdin 标准输入 0 键盘
stdout 标准输出 1 屏幕
stderr 标准错误 2 屏幕

重定向就是把这些流的"默认去向"改到文件中。

8.2 > 输出重定向

echo "hello Linux" > log.txt    # 将 "hello Linux" 写入 log.txt(覆盖写)
ls -l > output.txt              # 将 ls 的结果写入文件

>覆盖目标文件的原内容。每次执行都重新写入。

8.3 >> 追加重定向

echo "hello again" >> log.txt   # 在 log.txt 末尾追加一行(不覆盖原有内容)
date >> log.txt                 # 把当前时间追加到文件

>>追加,不会覆盖原有内容。适合累积日志。

8.4 < 输入重定向

cat < input.txt                 # 从 input.txt 中读取内容,传给 cat
wc -l < file.txt                # 统计 file.txt 的行数(输入重定向)

8.5 | 管道

管道符号 |前一个命令的输出作为后一个命令的输入

# 相当于"接力"——前一个命令的结果交给后一个命令继续处理
ls -l /usr/bin | grep "zip"     # 列出 /usr/bin 下所有含 "zip" 的文件
ps aux | grep "nginx"           # 查找 nginx 进程
cat file.txt | head -n 100 | tail -n 10  # 三命令组合

为什么要用管道?

Linux 哲学:每个命令只做一件事,但你可以用管道把它们组合起来完成复杂任务。

  • ls 只负责列出文件
  • grep 只负责搜索文本
  • headtail 只负责截取行

单独看,每个命令都很简单。但通过管道组合起来,威力就大了:

# 查找项目中最大的 5 个 .log 文件
find /var/log -name "*.log" -type f | xargs ls -lhS | head -5

💡 理解管道是 Linux 进阶的第一步。管道让你从"背命令"变成"组合命令"。


九、shell 命令以及运行原理

9.1 用户不能直接操作内核

Linux 严格意义上说只是内核(kernel)——它负责管理硬件、调度进程、分配内存。但用户不能直接操作内核(那太危险了——万一你直接写某块内存,系统就崩了)。

操作系统整体是分层结构:

+------------------------------------+
|  用户(User)                       |
+------------------------------------+
|  Shell(命令行解释器)               |
+------------------------------------+
|  内核(Kernel)—— 进程/内存/驱动管理  |
+------------------------------------+
|  硬件(CPU/内存/磁盘/网卡)           |
+------------------------------------+

9.2 Shell 是什么

Shell(壳)是命令行解释器,它的核心工作就是:

  1. 读取你在终端输入的命令
  2. 解析命令(拆解命令名、选项、参数)
  3. 调用内核提供的系统接口去执行命令
  4. 把执行结果返回给你

你可以把 Shell 理解成用户和内核之间的翻译官——你说的汉语(命令行)它翻译成机器能懂的指令。

9.3 bash

常见的 Shell 有:

  • bash(Bourne Again Shell)—— Linux 默认,最常用
  • sh(Bourne Shell)—— 最初的 Shell
  • zsh(Z Shell)—— 功能更丰富,macOS 默认
  • cshksh

你当前用的就是 bash。可以通过 echo $SHELL 验证。

9.4 类比理解

类比 Windows:你双击一个图标打开程序(GUI,图形用户界面),Linux 通过 Shell 命令行完成同样的事(CLI,命令行界面)。本质是一样的——都是用户和操作系统交互。只不过 Windows 用鼠标点,Linux 用键盘敲。

9.5 命令执行的大致流程

当你输入 ls -l /home 并回车:

  1. Shell 读取到字符串 "ls -l /home"
  2. Shell 解析出:命令 = ls,选项 = -l,参数 = /home
  3. Shell 到 $PATH 环境变量指定的路径(如 /bin/usr/bin)中查找 ls 程序
  4. 找到 /bin/ls 后,Shell 通过系统调用 fork + exec 创建子进程执行 ls
  5. ls 执行并输出结果
  6. Shell 打印提示符,等待下一条命令

十、Linux 权限基础

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
课堂笔记:Linux 用户分类和文件权限的初步理解

10.1 root 用户 vs 普通用户

Linux 是一个多用户操作系统,不同的用户有不同的权限。

用户类型 提示符 权限范围 危险性
root(超级管理员) # 无限制——可以做任何事
普通用户 $ 受限——只能操作自己的文件和系统允许的部分

登录时看到的是 # 还是 $,就能判断当前是不是 root。

10.2 su 切换用户

su root                 # 切换到 root 用户(需输入密码)
su - zhangsan           # 切换到普通用户 zhangsan
su                      # 不写用户名默认切换到 root

10.3 sudo 临时提权

sudo yum install gcc    # 普通用户临时以 root 身份执行命令

sudo 允许被授权的普通用户临时以 root 身份执行特定命令。普通用户能否使用 sudo,由 /etc/sudoers 文件决定。

为什么不用 su 直接切 root?在实际开发中,你的大部分时间应该用普通用户,只有需要管理员权限时才用 sudosu。这样可以减少误操作的风险

10.4 文件访问者分类

Linux 把访问文件的用户分为三类:

缩写 英文 含义
u user 文件拥有者(文件的创建者)
g group 文件所属组(同组内其他用户)
o others 其他人(既不是拥有者也不在组内)

为什么要有分组?想象一个场景:你写了一个项目文件,不希望别人碰,但同组的同事可以读。你就可以设 u=rw(自己可读写),g=r(同事可读),o=(其他人无权限)。


十一、文件类型和权限

11.1 ls -l 的输出怎么看

输入 ls -l,你会看到这样的输出:

-rw-r--r--  1 root root   1234 Mar 15 10:30 test.txt
drwxr-xr-x  2 root root   4096 Mar 15 10:31 mydir/

拆开来看:

第一个字符:文件类型
  - :普通文件
  d :目录
  l :软链接(类似 Windows 快捷方式)

第 2~10 字符:权限
  rw-  |  r--  |  r--
   u      g      o
 拥有者  组员   其他人

第 2 列:硬链接数
第 3 列:拥有者(user)
第 4 列:所属组(group)
第 5 列:文件大小(字节)
第 6~8 列:最后修改时间
第 9 列:文件名

11.2 文件类型列表

字符 文件类型 示例
- 普通文件 文本、二进制、代码
d 目录 文件夹
l 软链接(符号链接) 类似 Windows 快捷方式
b 块设备文件 硬盘、U 盘
c 字符设备文件 键盘、鼠标
p 管道文件 用于进程间通信
s socket 文件 网络通信

11.3 r、w、x 的含义

对普通文件来说:

权限 含义 具体表现
r 可以查看文件内容(cat、less、vim 查看)
w 可以修改文件内容
x 执行 可以运行这个文件(如果是可执行程序)

对目录来说:

权限 含义 具体表现
r 可以列出目录内容(ls 目录名)
w 可以在目录中创建、删除、重命名文件
x 执行 可以进入目录(cd 目录名)

🚨 重点强调:目录的 x 权限非常关键。

  • 你对一个目录只有 r 权限:你可以 ls 看到目录里有哪些文件,但不能 cd 进去
  • 你对一个目录只有 x 权限:你可以 cd 进去,但不能 ls 看到文件名(需要有 r)。
  • 你想对目录里的文件做任何操作:必须同时有 r + x(ls 和 cd 都要能)。

十二、权限的表示方法

12.1 字符表示法

就是我们上面看到的 rwxr-xr-- 这种形式,每 3 个字符一组:

u=rwx    # 拥有者:读+写+执行
g=r-x    # 组员:读+执行
o=r--    # 其他人:只读

12.2 八进制表示法

每个权限用一个数字表示,3 个权限位加起来就是组权限:

r = 4
w = 2
x = 1

常用组合:

八进制 字符表示 含义
7 rwx 读 + 写 + 执行
6 rw- 读 + 写
5 r-x 读 + 执行
4 r-- 只读
0 --- 无权限

12.3 常见权限模式

权限 含义 适用场景
755 rwxr-xr-x 可执行文件或目录(典型:用户可写,其他人只可读和执行)
644 rw-r–r– 普通文本文件
700 rwx------ 只有拥有者可读写执行
600 rw------- 只有拥有者可读写
777 rwxrwxrwx 所有人可读写执行(非常危险,尽量别用

12.4 chmod —— 修改权限

用户+操作符+权限 方式:

chmod u+x file.txt      # 给拥有者添加执行权限
chmod g-w file.txt      # 移除组员的写权限
chmod o=r file.txt      # 其他人的权限设为只读
chmod u+x,g-r file.txt  # 多个操作同时进行
chmod a+x file.txt      # 给所有人(all)添加执行权限

八进制方式:

chmod 755 file.txt      # rwxr-xr-x
chmod 644 file.txt      # rw-r--r--
chmod 700 file.txt      # rwx------
chmod 777 file.txt      # rwxrwxrwx —— 小心!

12.5 chown —— 修改拥有者

chown zhangsan file.txt          # 将文件拥有者改为 zhangsan
chown zhangsan:devteam file.txt  # 同时修改拥有者和所属组

只有 root 用户可以执行 chown

12.6 chgrp —— 修改所属组

chgrp devteam file.txt           # 将文件所属组改为 devteam

十三、目录权限深入理解

13.1 为什么有 r 权限不一定能 cd 进去?

# 实验
mkdir testdir
chmod 444 testdir       # dr--r--r-- 只有 r 权限,没有 x

ls testdir              # ✅ 可以看到文件名(有 r)
cd testdir              # ❌ permission denied!(没有 x)

原因:目录的 x 权限表示"允许进入目录"。只有 r 而没有 x,你只能"看一眼"目录里有什么,但进不去。

13.2 删除文件看的是目录权限

这是一个非常反直觉但很重要的知识点:

能否删除一个文件,取决于你对文件所在的目录是否有写权限,而不是文件本身的权限。

# 实验
touch test.txt
chmod 000 test.txt        # 文件权限全关
ls -l test.txt            # ---------- 1 root root 0 ...

rm test.txt               # ✅ 可以删除!

为什么能删除?因为 rm 删除文件时,修改的是目录内容(从目录中移除这个文件名和 inode 的对应关系),而不是修改文件本身。所以你只要有目录的 w + x 权限就能删除文件,和文件本身的权限无关。

13.3 粘滞位(sticky bit)

粘滞位是一个目录的特殊权限,加上粘滞位后,只有文件的拥有者和 root 才能删除目录里的文件,其他人即使是目录有写权限也不能删除别人的文件。

chmod +t /tmp            # 给 /tmp 目录添加粘滞位
ls -ld /tmp              # drwxrwxrwt ...(最后一个 t 就是粘滞位标志)

为什么需要粘滞位?

/tmp 来说——这是一个所有用户都可以写入的临时目录(权限是 777)。如果没有粘滞位,用户 A 创建了一个临时文件 A.tmp,用户 B 随手就把 A.tmp 删了——这显然不合理。

加上粘滞位后,只有文件拥有者和 root 才能删除 /tmp 里的文件。

chmod +t mydir           # 添加粘滞位
chmod -t mydir           # 移除粘滞位

十四、umask

14.1 什么是 umask

新建一个文件,它的默认权限不是 666(rw-rw-rw-),新建一个目录,默认权限也不是 777(rwxrwxrwx)——实际权限会比这些小一些。

为什么?因为 Linux 在创建文件时会用 umask 来屏蔽掉一部分权限。umask 就是"创建时要排除的权限"。

14.2 查看和设置 umask

umask              # 查看当前 umask(通常是 0022)
umask 0027         # 设置 umask

14.3 默认权限计算公式

文件默认权限 = 666 & ~umask
目录默认权限 = 777 & ~umask

& ~umask 的意思是:从完整权限中去掉 umask 中设置的位。

示例:umask = 0022

文件:666 & ~022 = 666 & 755 = 644(rw-r--r--)
目录:777 & ~022 = 777 & 755 = 755(rwxr-xr-x)

为什么 umask 通常是 0022?

  • 0 位(特殊权限位):不影响
  • 022:文件创建时,组员和其他人的写权限默认被去掉

这样新建的文件默认是 644——拥有者可读写,组员和他人只能读。这符合安全原则:默认不给别人写权限

# 修改 umask 后新建文件的权限会不同
umask 0027
touch newfile.txt
ls -l newfile.txt    # 权限变成 640(rw-r-----)

十五、yum 软件安装

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
课堂笔记:yum 包管理器的使用和软件源配置

15.1 yum 是什么?

yum = Yellowdog Updater Modified

简单说,yum 就是 Linux 上的"应用商店"——你在手机上从应用商店安装 App,你在 Linux 上用 yum 安装软件包。

# 两者的对比
手机 AppStore → 搜索 → 点击安装 → 自动处理依赖
Linux yum    → yum search → yum install → 自动处理依赖

15.2 Linux 软件的依赖关系

Linux 下的软件不是"一个安装包包含所有"的。一个程序通常依赖很多共享库(.so 文件):

你要安装 nginx:
  nginx 依赖 openssl
  openssl 依赖 zlib
  ...

手动解决这些依赖关系是噩梦——你可能要装几十个库才能跑起来一个程序。yum 的职责之一就是自动解决依赖关系:你只需要说"我要装 nginx",yum 会自动把 openssl、zlib 等依赖全部装好。

15.3 常用 yum 命令

# 安装软件(需要 root 权限)
yum install -y gcc           # -y 表示自动确认,不用手动输入 "y"
yum install -y gcc-c++       # C++ 编译器
yum install -y lrzsz         # rz/sz 文件上传下载工具

# 卸载软件
yum remove gcc               # 卸载 gcc

# 列出已安装/可用的软件
yum list                     # 列出所有可用软件包(太多了)
yum list | grep gcc          # 筛选 gcc 相关
yum list installed           # 列出已安装的

# 搜索软件
yum search "compiler"        # 搜索包含 "compiler" 关键词的软件包

15.4 yum 源

yum 不是自己知道有哪些软件的——它从**软件仓库(repository)**中获取信息。软件仓库的配置文件在 /etc/yum.repos.d/ 目录下。

ls /etc/yum.repos.d/
# CentOS-Base.repo  — base 源(基本软件)
# epel.repo         — epel 源(扩展软件)
  • base 源:CentOS 官方维护的基础软件源,包含大部分常用软件
  • epel 源:Extra Packages for Enterprise Linux,额外软件源,包含更多第三方软件

有时候 yum install 报错找不到软件包,可能就是因为需要的包在 epel 源中——需要先安装 epel-release:

yum install -y epel-release     # 安装 EPEL 源

15.5 rz/sz —— 和 Windows 传文件

安装 lrzsz 后,你就有了两个非常实用的命令:

yum install -y lrzsz

rz              # 从 Windows 上传文件到 Linux(弹出文件选择窗口)
sz filename     # 从 Linux 下载文件到 Windows

在 XShell 中,rz 会弹出一个 Windows 文件选择窗口,选好文件后自动上传到服务器的当前目录。


十六、常见易错点总结

# 易错点 说明
1 路径区分大小写 File.txtfile.txt 是两个不同的文件
2 rm -rf 很危险 特别是 rm -rf /rm -rf .*,删除前一定确认路径
3 root 权限很大,不要乱用 日常用普通用户,需要权限时用 sudo
4 cd … 是上级,cd / 是根目录 别搞混了 — .. 是上级,/ 是根
5 cd ~ 和 cd - 不同 ~ 回到家目录,- 回到上一个工作目录
6 cat 不适合大文件 几百行以上的文件用 lesshead
7 more 只能向下翻 less 可以上下翻还支持搜索
8 > 是覆盖, >> 才是追加 > 会清空文件重新写,>> 在末尾添加
9 目录的 x 权限很重要 没有 x 权限就不能 cd 进去
10 删除文件看的是目录权限 不是文件本身的权限决定的
11 chmod 777 不要乱给 等于让所有人可以做任何事,非常危险
12 yum install 失败可能是网络或源问题 检查是否能联网,检查 /etc/yum.repos.d/ 配置
13 cp 复制目录必须加 -r 不加 -r 会报错:omitting directory
14 mv 不同文件系统时不是 O(1) 跨文件系统 mv 实际上是 cp + rm
15 Linux 命令行下 Ctrl+C 不是复制 Ctrl+C 是终止当前程序,Ctrl+Insert 才是复制

十七、面试 / 学习常见问题

1. Linux 和 Windows 有什么区别?

从使用场景看:Windows 适合个人桌面、办公、游戏;Linux 适合服务器、嵌入式开发、云计算。从设计理念看:Linux 强调命令行、权限管理、多用户;Windows 强调图形界面、易用性、单用户友好。

2. Linux 为什么常用于服务器?

稳定(跑几年不重启是常态)、安全(权限体系完善、病毒少)、免费开源(没有授权费用)、资源占用低(没有图形界面时内存占用很小)。

3. 什么是 shell?

Shell 是命令行解释器——它读取用户的命令,解析后调用操作系统内核的接口去执行,最后把结果返回给用户。常见的 shell 有 bash、zsh 等。

4. shell 和 kernel 的关系是什么?

Kernel 是内核——管理硬件、进程、内存。Shell 是壳——负责用户和内核之间的交互。用户不能直接操作 kernel,必须通过 shell。

5. Linux 下"一切皆文件"是什么意思?

普通文件、目录、设备、网络连接、管道等在 Linux 中都被抽象为文件,用统一的接口(open/read/write/close)操作。这种设计让 Linux 的操作和编程接口简洁一致。

6. 绝对路径和相对路径有什么区别?

绝对路径从根目录 / 开始写(如 /home/user/file.txt),唯一确定;相对路径从当前目录开始写(如 ../file.txt),依赖当前在哪里。绝对路径在任何情况下都不会歧义,相对路径更简短。

7. cat、more、less 有什么区别?

三者都是查看文件内容的命令。cat 一次性输出全部内容,适合小文件;more 分页显示,但只能向下翻;less 分页显示,支持上下翻页和搜索,功能最强。

8. head 和 tail 如何配合使用?

head -n N file | tail -n 1 取第 N 行;head -n M file | tail -n K 取第 M-K+1 到 M 行。head 取前 M 行,tail 从结果中取后 K 行。

9. >>> 有什么区别?

> 输出重定向并覆盖原文件内容;>> 输出重定向并追加到文件末尾。

10. 管道 | 的作用是什么?

管道把前一个命令的标准输出作为后一个命令的标准输入,实现命令的"接力"组合。每个简单的命令通过管道可以完成复杂的任务。

11. root 用户和普通用户有什么区别?

root 是超级管理员,权限无限制;普通用户权限受限,只能操作自己的文件和被授权的部分。建议日常操作使用普通用户,需要管理员权限时用 sudosu

12. Linux 文件权限中的 r/w/x 分别是什么意思?

对文件:r 可读内容,w 可修改内容,x 可执行。对目录:r 可列出内容,w 可创建/删除文件,x 可进入目录。

13. 对目录来说 x 权限是什么意思?

x 权限表示"能否进入这个目录"。即使你有目录的 r 权限(可以 ls 看到文件名),但没有 x 权限也不能 cd 进去。x 是"通行证"。

14. chmod 755 是什么意思?

755(rwxr-xr-x):拥有者可以读、写、执行(7),组员可以读和执行(5),其他人可以读和执行(5)。这是常见的目录和可执行文件的权限设置。

15. umask 是什么?

umask 是"创建文件时屏蔽掉的权限",它决定了新文件和新目录的默认权限。文件默认权限 = 666 & ~umask,目录默认权限 = 777 & ~umask。最常见的 umask 是 0022。

16. 什么是粘滞位?

粘滞位(sticky bit)是一个目录的特殊权限。加上粘滞位后,只有文件拥有者和 root 能删除或重命名目录中的文件,其他人即使有目录的写权限也不能删除别人的文件。典型例子:/tmp 目录。

17. yum 是什么?

yum 是 Linux(RHEL/CentOS 系列)的包管理器,用于安装、更新、卸载软件。它能自动解决依赖关系,从软件仓库下载并安装软件包。

18. yum install 的底层大致做了什么?

  1. 读取 /etc/yum.repos.d/ 中的仓库配置
  2. 从远程软件仓库下载软件包元数据
  3. 解析要安装的软件的依赖关系
  4. 下载所有需要的软件包
  5. 安装并配置软件

十八、最后总结

本篇博客的学习主线

整个 Linux 入门过程可以总结为一条主线:

认识 Linux → 搭建环境 → 基本操作 → 常见命令 → 理解 Shell → 权限管理 → 软件安装

每一步都是下一步的基础:

  1. 认识 Linux:了解它的历史、哲学、和 Windows 的区别——这是"为什么学"的问题
  2. 搭建环境:买云服务器、装 XShell、远程登录——这是"怎么开始"的问题
  3. 基本操作:pwd、cd、ls——先搞清楚"我在哪,有哪些文件"
  4. 常见命令:20+ 个常用命令——熟练掌握后能独立完成日常操作
  5. 理解 Shell:命令怎么执行的、标准输入/输出是怎么回事——从"会用"到"理解"
  6. 权限管理:用户、文件权限、chmod、umask、粘滞位——这是 Linux 安全的基础
  7. 软件安装:yum——学会自己装软件

这些是后续学习的基石

本篇的内容是 Linux 系统编程的"前前前传"。

  • 学会了 ls -l 看权限 → 后面学文件系统时能理解 inode 和权限位
  • 学会了用户和权限 → 后面学进程时能理解实际用户 ID 和有效用户 ID
  • 学会了重定向和管道 → 后面学进程通信时能理解无名管道
  • 学会了 yum → 后面部署项目时能自己装环境和依赖

学习建议

  1. 多用,多练:光看博客是学不会 Linux 的。打开你的云服务器,每条命令都敲一遍。
  2. 不怕犯错:刚开始会经常打错命令、路径不对、权限不够——正常。犯错就是学习。
  3. 从 man 手册学习man 命令名 是最好的文档,而且每个 Linux 系统都有。
  4. 从错误信息学习:报错信息通常已经告诉了你原因——仔细读。
  5. 先学会走路再跑:先把 ls、cd、pwd 用熟练,再学管道、重定向,再去折腾权限配置。

Linux 是 C/C++ 后台开发者的"基本功"——就像游泳运动员需要会换气、篮球运动员需要会运球一样。基础打好了,后面的学习才会顺畅。希望这篇笔记能帮你迈过 Linux 入门的第一个台阶。pwd——知道你在哪ls——知道周围有什么cd——知道怎么过去。这三个命令搞明白了,Linux 的大门就推开了。


笔记整理自课堂学习、课程课件和 Linux 实践。如有错误或疏漏,欢迎指正。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐