Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Linux常用命令封面

在 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. 文件路径

  • 相对路径:以当前位置为参考出发的路径,路径短,好记。
  • 绝对路径:必须从根目录(/)为参考出发的路径。

二、终端

  1. Windows 的操作方式:图形化界面,鼠标点击操作。
  2. (在实际开发过程中)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
  • 安装指令:sudo apt install net-tools

如何解决虚拟机网络问题

1. 没有桥接网络适配器

  • 导致原因:VMware 重装,注册表未删除。
  • 解决办法:VMware 无法将网络更改为桥接状态:没有未桥接的主机网络适配器、网卡信息中缺失 VMware、虚拟机无法上网问题解决【测试成功】——墨天轮。

2. Ubuntu 显示网络状态为空心

  • 导致原因:无法自动桥接到主机可以上网的网络适配器上。
  • 解决办法:找到虚拟网络编辑器 → 手动指定能上网的网络适配器。

3. 之前能联网,现在无法联网

  • 导致原因:Ubuntu 在开机获取网络时,主机没网。一直获取不到网络,导致网络状态文件一直记录无网状态。
  • 解决办法:
    1. 关闭 Ubuntu 的网络服务:
      service NetworkManager stop
    2. 删除当前的网络状态文件:
      sudo rm /var/lib/NetworkManager/NetworkManager.state
    3. 重启 Ubuntu 的网络服务:
      service NetworkManager start

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
  • 编写内容:
  • 编写规范:
    1. 每行只写一句代码,每句代码以分号结尾;
    2. 注意代码缩进,遇到 {} 缩进;
    3. 编写注释,对代码的解释说明,不编译,不运行。
      • 单行注释://
      • 多行注释:/* 日期,作者,功能 */

2. 编译

  1. 默认编译:gcc xx.c,默认生成一个 a.out 可执行文件,多次编译会覆盖。
  2. 自定义编译: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 调试的过程

  1. 测试 —— 找出程序中存在的缺陷或错误。
  2. 固化 —— 让程序的错误可重现。
  3. 定位 —— 确定相关的代码行。
  4. 纠正 —— 修改代码纠正错误。
  5. 验证 —— 确定修改解决了问题。

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
2
3
list
l
l 行号

演示图片

演示图片

(4)设置断点

断点用于阻止程序的自动执行,转为手动执行,观察代码变量的变化。

  • break —— b(输入 break 的缩写也行) 行号。
  • 查看断点信息 —— info b。
  • 运行程序 —— run。
1
2
3
4
break 行号
b 行号
info b
run

演示图片

(5)手动逐步执行代码

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

演示图片

(6)打印变量

  • print —— p(输入 print 的缩写也行)—— 观察变量,查找问题所在。
1
2
print 变量名
p 变量名

(7)恢复自动运行

  • cont —— c(输入 cont 的缩写也行)。
1
2
cont
c

演示图片

(8)删除断点

  • delete —— d(输入 delete 缩写也行) 断点编号。
1
2
delete 断点编号
d 断点编号

(9)退出调试模式

  • quit —— q(输入 quit 的缩写也行)。
1
2
quit
q

十、项目管理工具:Makefile

1. Makefile 的作用

管理项目的编译过程。

2. 执行 Makefile 文件

  • 使用 make 进行执行。
  • make 默认执行当前目录下的 makefile 文件或 Makefile 文件。
  • 若要执行其他名字的 Makefile 文件,需要使用 -f:
1
make -f 文件名
  • 安装 make 命令:
1
sudo apt install make

3. 编辑 Makefile 文件

规则:

1
2
目标:依赖
指令

指令需要使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CC = gcc
SRC = src
LIB = lib
OUTPUT = output
INCLUDE = include

# 获取 src 下所有的 .c 文件,并以空格隔开
SRCPATH = $(wildcard $(SRC)/*.c)

# 去除文件目录 -- 只留文件名
SRCNOTPATH = $(notdir $(SRCPATH))

# 字符串替换
LIBPATH = $(patsubst %.c,$(LIB)/%.o,$(SRCNOTPATH))

$(OUTPUT)/main : $(LIBPATH)
$(CC) $^ -o $@

$(LIB)/%.o:$(SRC)/%.c
$(CC) -c $< -o $@ -I $(INCLUDE)

clean:
rm $(LIB)/*.o
rm $(OUTPUT)/main

echo:
@echo $(SRCPATH)
@echo $(SRCNOTPATH)
@echo $(LIBPATH)

TODO:待补充 14. Linux 环境搭建及常用指令

评论