
在 Linux 终端下工作,掌握常用命令是基本技能。
一、Linux 的文件系统
1. 目录介绍
最顶层的目录是根目录。
| 目录 | 说明 |
|---|---|
/ |
最顶层的目录——根目录,管理权限操作 |
~ |
主目录(用户目录),即 /home/用户目录 |
/boot |
启动文件,所有与系统启动有关的文件都保存在这里 |
/boot/grub |
GRUB 引导器相关的文件 |
/bin |
软件启动程序,开机自启;系统程序 |
/dev |
设备文件,Linux 中一切皆文件 |
/proc |
内核与进程镜像 |
/mnt |
临时挂载,如 U 盘 |
/media |
挂载媒体设备 |
/root |
root 用户的 $HOME 目录 |
/etc |
系统程序和大部分应用程序的全局配置文件 |
/etc/init.d |
System V 风格的启动脚本 |
/etc/rcX.d |
启动脚本的链接,定义运行级别 |
/etc/network |
网络配置文件 |
/etc/X11 |
图形界面配置文件 |
/home |
用户目录,家目录 |
/home/user |
普通用户的 $HOME 目录 |
/sbin |
管理员系统程序 |
/lib |
系统程序库文件 |
/usr/bin |
应用程序 |
/usr/sbin |
管理员应用程序 |
/usr/lib |
应用程序库文件 |
/usr/share |
应用程序资源文件 |
/usr/src |
应用程序源代码 |
/usr/local/soft |
用户程序 |
/usr/X11R6 |
图形界面系统 |
/var |
动态数据 |
/temp |
临时文件 |
/lost+found |
磁盘修复文件 |
2. 文件路径
- 相对路径:以当前位置为参考出发的路径,路径短,好记。
- 绝对路径:必须从根目录(
/)为参考出发的路径。
二、终端
- Windows 的操作方式:图形化界面,鼠标点击操作。
- (在实际开发过程中)Linux 的操作方式:无图形化界面,使用终端(命令提示符)输入指令。
设置终端字体大小
- 临时设置:
- 放大:
Ctrl + Shift + + - 缩小:
Ctrl + -
- 放大:
- 永久设置:修改配置文件(设置)。
三、指令
1. 指令的组成
指令 [选项] [参数]
- 选项:如
-a、-l、-r等。 - 参数:文件名、目录名。
这里的目标文件/目录和目的文件/目录都是指可以加相对地址/绝对地址的文件/目录。
2. 常用指令
| 序号 | 功能 | 命令 | 说明 |
|---|---|---|---|
| 1 | 查看当前位置路径 | pwd |
绝对路径显示 |
| 2 | 查看当前位置的内容 | ls 目的文件 |
|
| 3 | 查看当前位置的内容(包括隐藏文件) | ls -a |
|
| 4 | 查看当前位置的内容(详细信息) | ls -l |
|
| 5 | 查看当前位置的内容(隐藏文件和详细信息) | ll |
|
| 6 | 创建目录 | mkdir 目的目录 |
|
| 7 | 进入到目录中 | cd 目的目录 |
|
| 8 | 创建文件 | touch 目的文件 |
仅创建 |
| 9 | 编辑文件 | gedit 目的文件 / vi / vim |
gedit 桌面版自带,类似记事本 |
| 10 | 查看文件 | cat 目的文件 |
仅查看 |
| 11 | 查看文件并显示行号 | cat -n |
|
| 12 | 复制文件 | cp 目标文件 目的文件 |
|
| 13 | 复制目录 | cp -r 目标目录 目的目录 |
|
| 14 | 剪切/移动/重命名 | mv 目标文件 目的文件 |
|
| 15 | 删除文件 | rm 目的文件 |
永久删除,慎重 |
| 16 | 删除目录 | rm -r 目的目录 |
|
| 17 | 压缩文件 | tar -cvf 压缩文件.gz/.tar.gz 目标目录 |
c:创建;v:显示压缩/解压的过程;f:必须紧跟压缩后文件 |
| 18 | 解压文件 | tar -xvf 解压文件.gz |
默认解压到当前目录 |
3. 权限与链接
修改权限:
chmod- 符号模式
- 八进制模式
链接文件
- 硬链接:
ln xx xxx- 特点:链接文件的文件属性与原文件完全一致。
- 原文件改变,链接文件也会跟着改变,反之亦然。
- 原文件删除后,链接文件无影响,可以正常使用。
- 软链接:
ln -s xxx xxxx- 特点:链接文件的文件属性与原文件不一致,具有独立的文件属性信息。
- 原文件改变,链接文件也会跟着改变,反之亦然。
- 原文件删除后,链接文件有影响,不能正常使用。
- 硬链接:
4. 回显指令
- 回显到终端:
echo "内容" - 回显到文件:
echo "内容" > 文件名- 若没有文件会创建文件。
- 若有文件会删除文件内容。
- 回显到文件,并换行追加写入:
echo "内容" >> 文件名
5. 用户相关
| 功能 | 命令 | 说明 |
|---|---|---|
| 新增用户 | useradd |
仅创建用户,没有用户目录和用户密码 |
| 新增用户 | adduser |
创建用户,具有用户目录和用户密码 |
| 修改密码 | passwd |
|
| 删除用户 | userdel |
6. 系统相关
| 功能 | 命令 |
|---|---|
| 查看程序的进程号 | ps -ef |
| 杀死进程 | kill -9 进程号(强制死亡) |
| 查看进程状态 | ps -aux |
| 动态进程 | top |
| CPU 的利用率(某一段的利用率) | uptime |
7. 网络相关
- 查询 IP 地址:
- Windows:
ipconfig - Linux:
ifconfig
- Windows:
- 安装指令:
sudo apt install net-tools
如何解决虚拟机网络问题
1. 没有桥接网络适配器
- 导致原因:VMware 重装,注册表未删除。
- 解决办法:VMware 无法将网络更改为桥接状态:没有未桥接的主机网络适配器、网卡信息中缺失 VMware、虚拟机无法上网问题解决【测试成功】——墨天轮。
2. Ubuntu 显示网络状态为空心
- 导致原因:无法自动桥接到主机可以上网的网络适配器上。
- 解决办法:找到虚拟网络编辑器 → 手动指定能上网的网络适配器。
3. 之前能联网,现在无法联网
- 导致原因:Ubuntu 在开机获取网络时,主机没网。一直获取不到网络,导致网络状态文件一直记录无网状态。
- 解决办法:
- 关闭 Ubuntu 的网络服务:
service NetworkManager stop - 删除当前的网络状态文件:
sudo rm /var/lib/NetworkManager/NetworkManager.state - 重启 Ubuntu 的网络服务:
service NetworkManager start
- 关闭 Ubuntu 的网络服务:
4. 三种解决办法使用后,还显示无网
- 重启网络模块,重新连接网络。
- 虚拟机右下角:右键 → 断开网络;再右键 → 连接。
8. 安装相关
- 在线安装
- 更新资源包:
sudo apt-get update - 下载并安装:
sudo apt-get install ...
- 更新资源包:
- 离线安装
dpkg -i 安装包(Linux)
9. 其他指令
| 功能 | 命令/操作 | 说明 |
|---|---|---|
| 权限下放 | sudo |
下放某个权限到某个操作 |
| 修改用户密码 | sudo passwd 用户名 |
如 root 等;终端显示密码时不显现 |
| 切换用户 | su 用户名 |
如 root 等 |
| 在线更新资源包 | sudo apt-get update |
|
| 在线下载并安装 | sudo apt-get install ... |
... 表示要下载的文件 |
| 离线安装 | dpkg -i 安装包 |
提供安装包 |
| 查看历史执行 | history |
仅查看 |
| 执行历史操作 | 方向键(上下键) | |
| 自动补全 | Tab 键 |
|
| 清屏 | clear |
指令详情可以查看菜鸟教程:https://www.runoob.com/
四、C 语言程序结构
1. 编写
- 编译器:
gedit、vscode - 文件后缀:
.c文件,编写的让计算机执行的有序指令集合,如main.c - 编写内容:
- 编写规范:
- 每行只写一句代码,每句代码以分号结尾;
- 注意代码缩进,遇到
{}缩进; - 编写注释,对代码的解释说明,不编译,不运行。
- 单行注释:
// - 多行注释:
/* 日期,作者,功能 */
- 单行注释:
2. 编译
- 默认编译:
gcc xx.c,默认生成一个a.out可执行文件,多次编译会覆盖。 - 自定义编译:
gcc xx.c -o xxx,编译文件重命名为编译后的文件名。
3. 运行
./可执行程序,如./a.out、./main
五、Linux 操作系统的主要特性
- Linux 操作系统的重要思想:一切皆文件。
- Linux 操作系统的特性:
- 完全免费
- 支持多平台
- 支持多用户,多任务
- 有良好的界面
- 完全兼容 POSIX 1.0 的标准
六、Linux 系统版本
- 服务器版(server - 服务器版)
- 桌面版(LTS - 长期支持版本)
七、Linux 常用工具
1. Vim 编辑器
Vim 是 vi 的增强版,一般使用 Vim。
安装 Vim
1 | sudo apt install vim |
使用 Vim
1 | vim 文件名 |
特点:若文件不存在,则在保存时创建该文件。
配置 Vim
- 全局配置:修改
/etc/vim/vimrc文件。 - 当前用户配置:将编辑好的
vimrc放到主目录,并改名为.vimrc(隐藏文件)。
Vim 的四种操作模式
命令模式
| 操作 | 按键 | 说明 |
|---|---|---|
| 复制一行 | yy |
|
| 复制 n 行 | nyy |
n 为正整数,表示要复制的行数 |
| 粘贴 | p |
|
| 删除一行 | dd |
|
| 删除 n 行 | ndd |
|
| 撤销 | u |
|
| 反撤销 | Ctrl + r |
|
| 移动光标到首位 | gg |
|
| 移动光标到末尾 | G |
|
| 移动光标到指定行 | nG |
插入模式
| 操作 | 按键 |
|---|---|
| 在光标位置进行插入 | i |
底行模式
| 操作 | 命令 | 说明 |
|---|---|---|
| 退出编辑器 | :q |
|
| 保存编辑器 | :w |
|
| 保存退出 | :wq |
|
| 强制操作 | ! |
|
| 强制退出 | :q! |
|
| 强制保存 | :w! |
|
| 强制保存退出 | :wq! |
|
| 搜索关键字并高亮显示 | :/字符串 |
使用 :noh 去除高亮显示 |
| 替换字符串 | :%s/原字符串/目标字符串/g |
可视模式
| 操作 | 按键 | 说明 |
|---|---|---|
| 复制 | y |
默认从光标位置开始选择复制内容 |
| 粘贴 | p |
|
| 删除 | d |
|
| 剪切 | x |
Vim 操作问题
- 问题:不保存,直接关闭终端。
- 解决办法:先恢复,再删除交换文件。
八、C 语言编译与库文件
1. GCC 编译
直接编译,没有任何选项:
1 | gcc xx.c |
2. 编译过程(重点)
| 阶段 | 命令 | 输出 |
|---|---|---|
| 预处理 | gcc -E a.c -o a.i |
.i |
| 编译 | gcc -S a.i -o a.s |
.s |
| 汇编 | as a.s -o a.o |
.o |
| 链接 | gcc a.o -o main |
可执行文件 |
3. 编译选项
| 选项 | 说明 |
|---|---|
-E |
只做预处理 |
-S |
预处理 + 编译 == 汇编文件 |
-c |
预处理 + 编译 + 汇编 == 编译文件 .o |
-o |
编译文件重命名 |
-g |
直接生成可调试的执行文件,供 gdb 调试 |
4. 库文件
库文件的作用
- 保护源代码
- 方便移植
库文件的分类
静态库文件:.a
- 除
main.c之外,把所有的.c文件封装成.o文件:
1 | gcc -c |
- 封装静态库:
1 | ar -rc -o libcal *.o |
- 验证静态库。
- 特点:库文件存放位置为项目目录,占用项目空间资源,查找速度快——以空间换时间。
动态库文件:.so
- 除
main.c之外,把所有的.c文件封装成.o文件:
1 | gcc -c -fpic |
- 封装动态库:
1 | gcc -fpic -shared -o libcal.so *.o |
- 移动库文件到
/lib或/usr/lib下。 - 验证动态库。
- 特点:动态库文件一般不在项目结构中存放,不占用项目空间资源,但是需要到
/lib查找库文件,编译浪费时间——以时间换空间。
九、GDB 调试
1. 为什么进行 GDB 调试
- 初始代码大概率都是具有 bug 存在,为了能够快速找到代码问题,需要使用调试工具逐步执行代码,观察代码的运行结果。
- 人为注意力丢失,手敲的代码中一般 100 行就有 2 个左右的错误。
2. GDB 调试的过程
- 测试 —— 找出程序中存在的缺陷或错误。
- 固化 —— 让程序的错误可重现。
- 定位 —— 确定相关的代码行。
- 纠正 —— 修改代码纠正错误。
- 验证 —— 确定修改解决了问题。
3. GDB 调试步骤
(1)生成可调试的执行文件
- 可调试的执行文件大小比正常执行文件要大。
- 使用
gcc -g生成可调试的执行文件。
1 | gcc -g main.c -o main |

(2)进入到 GDB 调试中
1 | gdb 可调试的执行文件 |

(3)查看代码
list——l(或输入list的缩写l也行)—— 默认显示 10 行代码。l 行号—— 显示行号上下各 5 行。
1 | list |


(4)设置断点
断点用于阻止程序的自动执行,转为手动执行,观察代码变量的变化。
break——b(输入break的缩写也行) 行号。- 查看断点信息 ——
info b。 - 运行程序 ——
run。
1 | break 行号 |

(5)手动逐步执行代码
next——n(输入next的缩写也行)—— 逐步执行代码,遇到函数直接得到函数结果,继续执行。step——s(输入step的缩写也行)—— 逐步执行代码,遇到函数进入函数逐步执行。
1 | next |

(6)打印变量
print——p(输入print的缩写也行)—— 观察变量,查找问题所在。
1 | print 变量名 |
(7)恢复自动运行
cont——c(输入cont的缩写也行)。
1 | cont |

(8)删除断点
delete——d(输入delete缩写也行) 断点编号。
1 | delete 断点编号 |
(9)退出调试模式
quit——q(输入quit的缩写也行)。
1 | quit |
十、项目管理工具:Makefile
1. Makefile 的作用
管理项目的编译过程。
2. 执行 Makefile 文件
- 使用
make进行执行。 make默认执行当前目录下的makefile文件或Makefile文件。- 若要执行其他名字的 Makefile 文件,需要使用
-f:
1 | make -f 文件名 |
- 安装
make命令:
1 | sudo apt install make |
3. 编辑 Makefile 文件
规则:
1 | 目标:依赖 |
指令需要使用 Tab 缩进。
- 目标 —— 指的是要得到的目标文件。
- 依赖 —— 指的是要想得到目标需要提供的文件。
- 指令 —— 指的是通过依赖生成目标所需要执行的命令。
(1)第一个 Makefile 文件

(2)逐渐复杂的第二个 Makefile 文件 —— 编译过程
Makefile 中存在多目标时,第一个目标作为主目标进行执行,其他目标均是为了得到主目标而进行的。

(3)逐渐复杂的第三个 Makefile 文件 —— Makefile 中的变量
普通变量
- 定义:
变量名 = 值 - 应用:
$(变量名)

特殊变量
$@—— 目标。$^—— 所有依赖。$<—— 所有依赖的第一个依赖,依次递进。

(4)逐渐复杂的第四个 Makefile 文件 —— 伪目标
伪目标:一个“命令的别名”或者“动作的标签”,它假装成一个构建目标,但实际上并不代表磁盘上的任何真实文件。
必须显式声明:必须用 .PHONY 告诉 Make 工具,一旦声明,就彻底放弃对它的文件检查,每次调用都必定执行下面的命令。

- 执行伪目标 ——
make 伪目标名称:
1 | make 伪目标名称 |

- 打印伪目标:

(5)逐渐复杂的第五个 Makefile 文件 —— 项目级的 Makefile 文件 —— 通用的 Makefile
Makefile 中的常用函数
获取目录下的所有满足要求的文件 —— .c 文件
可以使用通配符:* 表示所有,*.c 表示所有的 .c 文件。
1 | $(wildcard PATTERN) |
- 函数名称:获取匹配模式文件名函数 ——
wildcard。 - 函数功能:列出当前目录下所有符合模式
PATTERN格式的文件名。 - 返回值:空格分割的、存在当前目录下的所有符合模式
PATTERN的文件名。
去除目录,只留文件名
1 | $(notdir NAMES...) |
- 函数名称:取文件名函数 ——
notdir。 - 函数功能:从文件名序列
NAMES...中取出非目录部分。目录部分是指最后一个斜线/(包括斜线)之前的部分。删除所有文件名中的目录部分,只保留非目录部分。 - 返回值:文件名序列
NAMES...中每一个文件的非目录部分。
字符串替换
1 | $(patsubst PATTERN, REPLACEMENT, TEXT) |
- 函数名称:模式替换函数 ——
patsubst。 - 函数功能:搜索
TEXT中以空格分开的单词,将符合模式PATTERN的替换为REPLACEMENT。参数PATTERN中可以使用模式通配符%,来代表一个单词中的若干字符。如果参数REPLACEMENT中也包含一个%,那么REPLACEMENT中的%将是PATTERN中的那个%所代表的字符串。在PATTERN和REPLACEMENT中,只有第一个%被作为模式字符来处理,之后出现的不再作模式字符(作为一个字符)。在参数中如果需要将第一个出现的%作为字符本身而不作为模式字符时,可使用反斜杠\进行转义处理(转义处理的机制和使用静态模式的转义一致)。
示例:
1 | CC = gcc |
TODO:待补充 14. Linux 环境搭建及常用指令