目录
引言:
2.1 网络下载 wget /curl/aria2c
wget(最简单,适合普通下载)
curl(通用 http 工具,不仅能下载,还能发网络请求)
aria2c(多线程下载神器,大文件强烈推荐)
2.2 打包和压缩 tar /zip/unzip /7z
tar 命令
zip /unzip(和 Windows 互通)
7z(高压缩率)
2.3 文档处理补充 wc /grep/sed
wc 文本统计
grep 文本搜索,查找日志关键字
sed 文本替换,批量字符串替换
2.4 符号链接和硬链接 ln
符号链接(软链接,Windows 快捷方式)
硬链接 ln(不带 – s)
2.5 后台任务和终端复用器 bg/fg/jobs/nohup/screen/tmux
传统后台任务管理
不被挂断的任务
终端复用器 (tmux screen)
2.6 系统资源查询
任务管理器 top /htop
进程中止 kill /pkill
磁盘相关
网络状态查看
2.7 磁盘挂载 mount /umount
什么是挂载?
2.8 环境变量
export 设置环境变量
PATH(最重要环境变量)
LD_LIBRARY_PATH 动态库路径
2.9 Bash 配置文件~/.bashrc source
2.10 拾遗补缺
watch:定时重复执行命令
tee:同时输出到终端 + 保存文件
diff:比较文件差异
uname 查看系统内核信息
终端容易误触快捷键汇总
结语:
引言:
上篇文章讲了关于学习Linux时必须了解的核心基础知识,感兴趣的可以阅读:只学够用的Linux!零基础核心知识点(上)-CSDN博客,
这一章将继续介绍一些实际使用中非常常见的功能,不过它们是否需要学习因人而异。如果你认为完全用不到某个小节的内容,可以直接跳过。
另外,阅读第 1 章后读者应该已经对 Linux 初步熟悉了,因此从第 2 章开始,本教程的写作风格将会变得精简。

2.1 网络下载 wget /curl/aria2c
这一节将介绍三个工具wget、curl 和 aria2c, 服务器环境没有浏览器,下载文件全部依靠命令行工具,其中wget 最易用,aria2c 最强大,三个工具熟悉其中一个就够用。
wget(最简单,适合普通下载)
# 安装
sudo apt install wget -y
# 基础下载,保存为原文件名
wget https://example.com/file.zip
# -O 指定保存文件名
wget -O myfile.zip https://example.com/file.zip
# -P 指定下载保存到某个目录
wget -P /data/downloads https://example.com/file.zip
# -c 断点续传,大文件网络中断后接着下
wget -c https://example.com/file.zip
curl(通用 http 工具,不仅能下载,还能发网络请求)
#安装
sudo apt install curl -y
# -O大写,使用远程原文件名保存
curl -O https://example.com/file.zip
# -o小写,自定义保存文件名
curl -o myfile.zip https://example.com/file.zip
# -L 跟随网页重定向,绝大多数下载链接必须加这个参数
curl -L -O https://example.com/file.zip
# 断点续传
curl -L -C – -O https://example.com/file.zip
aria2c(多线程下载神器,大文件强烈推荐)
类似 Windows IDM 下载器,支持多线程并发下载,默认自带断点续传
#安装
sudo apt install aria2 -y
#基础下载
aria2c https://example.com/file.zip
# -x -s 设置并发线程,16线程加速下载
aria2c -x 16 -s 16 https://example.com/file.zip
# -o 指定文件名
aria2c -o myfile.zip https://example.com/file.zip
# -d 指定保存目录
aria2c -d /data/downloads https://example.com/file.zip
小提示:AI 大模型权重文件体积巨大,优先使用aria2c。
2.2 打包和压缩 tar /zip/unzip /7z
本节将介绍以下工具:tar, zip, unzip, 7z。
tar:Linux 原生打包工具,可以保留权限、所有者元信息;zip:跨 Windows 最通用;7z:压缩率最高。
tar 是一个打包工具,但它可以帮忙调用 gzip, zstd 等压缩工具实现打包+压缩。同时 tar 可以将 Linux 文件系统里的对象元数据储存(例如所有者、所属用户组、对象权限等),因此在 Linux 里 tar 是最地道的打包方式。
tar 命令
这几个参数几乎永远都一起使用,因此可以直接背下来,它们的含义分别是:
- c:创建归档
- x:解包归档
- v:显示正在处理的文件
- z:使用 gzip 压缩/解压
- f:后面紧跟归档文件名
# 仅打包(不压缩)
tar -cvf archive.tar dir/
# 解包
tar -xvf archive.tar
# 打包+gzip压缩 .tar.gz
tar -cvzf archive.tar.gz dir/
# 解压tar.gz
tar -xvzf archive.tar.gz
高级提速用法:
# 1. 多线程 gzip 压缩
# tar 默认调用的 gz 压缩器仅支持单线程压缩,pigz 压缩器支持多线程,速度更快
# 首先确保安装了 pigz 这个软件包
sudo apt install pigz -y
# 然后压缩/解压时去除 -z 参数,使用 -I 指定压缩器为 pigz
tar -I pigz -cvf archive.tar.gz dir/
tar -I pigz -xvf archive.tar.gz
# 2. zstd 压缩
# zstd 是相比 gzip 更好的压缩算法,它更快,而且通常压缩率更高
# 首先确保安装了 zstd 这个软件包
sudo apt install zstd -y
# 然后压缩/解压时去除 -z 参数,使用 –zstd 指定使用 zstd 算法
tar –zstd -cvf archive.tar.zst dir/
tar –zstd -xvf archive.tar.zst
zip /unzip(和 Windows 互通)
#安装
sudo apt install zip unzip -y
#压缩目录 -r递归
zip -r archive.zip dir/
#解压
unzip archive.zip
7z(高压缩率)
sudo apt install p7zip-full -y
#压缩 a代表add添加
7z a archive.7z dir/
#解压 x代表解压
7z x archive.7z
注意:7z 压缩速度慢,适合归档备份,不适合日常快速打包。
2.3 文档处理补充 wc /grep/sed
服务器排查日志、批量修改配置文件必用三件套。
wc 文本统计
如果你有一个纯文本,需要统计它的长度和行数信息,可以使用 wc 命令。
- 命令:wc(意为 word count)
- 用途:统计文本信息
- 核心参数:
- 位置参数:想统计文件的路径
- -l:只统计行数
- -w:只统计单词数
- -c:只统计字节数
- -m:只统计字符数
不加任何参数时,wc 默认统计行数、单词数、字节数,输出格式如下:
[行数] [单词数] [字节数] [文件名]
# 默认输出:行数 单词数 字节数 文件名
wc test.txt
# -l只统计行数
wc -l test.txt
# -w统计单词
wc -w test.txt
# -c统计字节
wc -c test.txt
grep 文本搜索,查找日志关键字
简要常用参数:-i忽略大小写,-n显示行号,-r递归搜索,-v反向过滤,-C显示上下文
如果你希望在文本中搜索某个模式(pattern),grep 是一个非常强大的工具。
- 命令:grep(意为 global regular expression print)
- 用途:文本搜索
- 核心参数:
- 位置参数 1:搜索内容的正则表达式
- 位置参数 2:想搜索文件的路径
- -i:忽略大小写
- -n:显示行号
- -r:递归搜索目录
- -v:显示不匹配的行
- -w:只匹配完整单词
- -F:按普通字符串匹配,不解析正则表达式
- -C 行数:显示匹配行前后各 n 行
grep 是一个强大的工具,因此参数非常多,上面我只挑选了最核心的参数,下面是一些示例。
#查找包含error的行
grep "error" access.log
#显示匹配行+行号
grep -n "error" access.log
#递归搜索整个logs目录所有文件
grep -r "error" logs/
#-v反向,过滤掉debug行,只看剩下内容
grep -v "debug" access.log
#-C 2 打印匹配行,同时打印前后各2行上下文
grep -C 2 "error" access.log
# 打印包含单词err的行,不会匹配error中的err
grep -w "err" access.log
#-F把搜索内容当普通字符串,不解析正则符号. *
grep -F "192.168.1.100" access.log
sed 文本替换,批量字符串替换
如果你希望在文本中替换某个字符串,可以使用 sed 命令,其查找部分默认按照正则表达式解释。
- 命令:sed(意为 stream editor)
- 用途:文本编辑(常用于字符串替换)
- 核心参数:
- 位置参数 1:替换方式
- 位置参数 2:想修改文件的路径
- -i:直接修改源文件,保存后不可恢复!
指定替换方式的位置参数 1 的最常用的用法如下:
#输出到终端预览替换效果,不会修改原文件
sed 's/旧字符串/新字符串/g' test.txt
#-i直接修改源文件,全部替换(g代表全局)
sed -i 's/Before/After/g' test.txt
#分隔符可以换成! #,避免路径斜杠冲突
sed -i 's!/opt/old!/opt/new!g' test.txt
-i参数代表直接修改源文件,操作前务必备份文件!
这里提一下备份文件操作,如何备份原始日志文件 test_log.txt :
cp test_log.txt test_log.txt.bak
逐段解析:
cp:copy 复制命令 test_log.txt:源文件,我们的原始日志, test_log.txt.bak:备份文件,后缀.bak是行业通用备份后缀,方便一眼识别是备份文件
如果想把备份文件还原回原日志文件:
cp test_log.txt.bak test_log.txt
这里可以拓展一下在备份的时候可以加上时间戳,防止多次备份覆盖旧备份:
cp test_log.txt test_log.txt.$(date +%Y%m%d_%H%M%S).bak
$(date +%Y%m%d_%H%M%S):命令替换,执行 date 命令,拼接年月日_时分秒,示例生成文件名就是:test_log.txt.20261017_203010.bak
sed 自带备份参数:
在执行sed替换,同时生成备份文件:
sed -i.bak 's/error/ERR/g' test_log.txt
注意:-i和.bak中间不能有空格,不能写成 -i .bak,会报错!
2.4 符号链接和硬链接 ln
符号链接(软链接,Windows 快捷方式)
符号链接相当于一个快捷方式,如果原始文件/目录是 a,那么创建一个符号链接 b 指向 a 后,通过 b 就可以直接访问到 a,如图所示:

语法:ln -s 原文件/目录 链接路径
#创建链接link.txt指向original.txt
ln -s original.txt link.txt
#创建家目录下project软链接指向/data/project
ln -s /data/project ~/project
特性:
mv /mnt/disk_a/project_data /mnt/disk_b
ln -s /mnt/disk_b/project_data /mnt/disk_a/project_data
硬链接 ln(不带 – s)
硬链接和符号链接不同,它并不是一个“快捷方式”。创建硬链接后,两个文件名的地位完全相同,它们共同指向同一个 inode(文件数据节点),就仿佛两个 C 语言指针指向同一个对象。如图所示:

Linux 会记录一个 inode 被多少个文件名引用,这个数量称为链接数。创建上述硬链接后,链接数为 2;删除 original.txt 或 hardlink.txt 中任意一个后,链接数变成 1,文件数据仍然存在。只有两个文件名都被删除后,链接数才会归零,文件数据才会被删除。
通过 ln 命令也能创建硬链接,只有同文件系统的文件可以创建硬链接:ln 原对象 链接名
# 创建硬链接 link.txt 指向 original.txt
ln original.txt link.txt
特性重点:
2.5 后台任务和终端复用器 bg/fg/jobs/nohup/screen/tmux
在一个 Shell 中,运行一个命令后它就独占了整个 Shell,如果这个命令很耗时,那此时就无法再运行第二个命令了。这时候我们有多种解决方案,分别是 Linux 传统的前后台任务机制以及更为强大易用的终端复用器。此外,本节还会提供“SSH 断开后运行的任务被终止”的解决方案。
痛点场景:SSH 远程服务器跑训练任务,如果关闭终端 / 网络断开,普通进程直接被杀掉。
传统后台任务管理
(1)将前台任务挂到后台
假如运行了一个极为耗时的命令:
sleep 3600
此时希望将其切到后台,让开 Shell,那么可以按键盘快捷键 Ctrl + Z。此时 Shell 会弹出提醒,代表着命令已经被挂到后台,同时已经被暂停了:

如果我们希望在后台它继续运行,需要使用命令:
bg
此时 Shell 会弹出提醒,代表挂到后台的任务重新开始在后台运行了:

(2)直接新建后台任务
如果你已经知道一个命令很耗时,打算直接把它挂到后台,那么可以在命令的末尾添加 & 符号,代表直接新建后台任务:
sleep 1800 &
此时,执行完命令后它就直接进入后台并继续运行了,不会占用 Shell,同时会弹出提醒:

(3)将后台任务取回前台
若要将后台任务取回前台,可以使用命令:
fg
如果此时有多个后台任务,默认取回最近一个。也可以通过序号来指定,首先用命令列出所有后台任务:
jobs
会以列表打印出所有后台任务和任务的状态:
[1] Running sleep 3600 &
[2]- Running sleep 1800 &
[3]+ Stopped sleep 2400
然后使用 %序号 来指定要取回前台的后台任务:
fg %1 # 取回任务1
fg %2 # 取回任务2
fg %3 # 取回任务3
不被挂断的任务
对于普通任务,当 SSH 或者 Shell 关闭时,任务都会收到来自 Shell 的 SIGHUP 信号而被终止。如果希望任务在 SSH 或者 Shell 关闭时继续正常运行,就需要 nohup 命令了。
nohup:挂断 SSH 进程不会被杀
SIGHUP 信号:ssh 断开会发送这个信号终止程序,nohup 屏蔽该信号。
在命令前添加 nohup 即可创建不被挂断的任务:
nohup python train.py
如果希望直接创建不被挂断的后台任务,可以使用:
nohup python train.py &
如果希望把任务的输出导出保存为文件,可以使用下面的写法(最常见的组合):
nohup python train.py >train.log 2>&1 &
│ │ └─ 挂到后台
│ └────── 将 stderr 写入 stdout(即 train.log)
└───────────────── 将 stdout 写入 train.log
终端复用器 (tmux screen)
(1)tmux 工具(强烈推荐,替代 nohup,AI 训练首选)
比 nohup 好用,会话独立,断开 ssh 再重连可以恢复之前终端界面。
#安装
sudo apt install tmux
#新建会话并命名
tmux new -s train
# 在tmux窗口里面随便跑程序 python train.py
# 脱离会话(后台继续跑)快捷键:Ctrl+B,松开,再按D
#查看所有会话
tmux ls
#重新接入会话
tmux attach -t train
示例:

(2)screen 工具
//没有的话首先安装
sudo apt install screen
//创建会话
screen -S train
// 脱离 Ctrl+A 松开 D
// 查看已有的会话
screen -ls
// 指定会话名重新进入
screen -r train
重要提醒:远程跑长时间任务优先tmux,不建议裸用 nohup。
2.6 系统资源查询
Windows 有任务管理器来查看系统资源的使用情况,相同的,Linux 也有丰富的工具来查询和管理系统资源,本节将会介绍以下工具:
- 任务管理器(CPU、内存和进程):top, htop
- 进程中止:kill, pkill
- 磁盘状态查看:du, df, lsblk, iotop
- 网络状态查看:ifconfig, iftop, nload
任务管理器 top /htop
本节将会介绍查看管理 CPU、内存和进程的任务管理器 top 和 htop,前者是绝大多数 Linux 发行版都会自带的系统组件,后者需要手动安装,但是更为强大和好用。
(1)top 工具(table of processes)
使用 top 命令即可打开任务管理器,打开后用 q 或 Ctrl + C 退出。top 会占满终端并自动刷新,界面如下:

首先看到顶部的五行信息,理解如下:
top – 16:30:14 up 25 min, 2 users, load average: 0.15, 0.52, 0.59
当前时间;系统已运行时间;当前登录用户数;过去 1、5、15 分钟的平均负载
Tasks: 299 total, 1 running, 297 sleeping, 1 stopped, 0 zombie
进程总数;正在运行的进程数;休眠进程数;已停止进程数;僵尸进程数
%Cpu(s): 4.0 us, 8.0 sy, 0.0 ni, 88.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
用户进程占用;内核占用;调整过 nice 的进程占用;CPU 空闲;等待 I/O;硬件中断;软件中断;被虚拟机宿主机占用
MiB Mem : 3863.4 total, 601.0 free, 1190.3 used, 2308.9 buff/cache
物理内存总量;空闲内存;已使用内存;缓冲区和缓存
MiB Swap: 3867.0 total, 3867.0 free, 0.0 used, 2673.1 avail Mem
Swap 总量;Swap 空闲;Swap 已使用;预计可用物理内存
除了显示当前系统的状态外,top 还能显示和管理进程,这就是下面的表格显示的内容。首先看到表头,每一列的含义是:
- PID – 进程编号
- USER – 启动该进程的用户
- PR – 进程调度优先级,数值越小优先级越高
- NI – 进程 nice 值,数值越小优先级越高
- VIRT – 虚拟内存总量
- RES – 实际驻留在物理内存中的大小
- SHR – 共享内存大小
- S – 进程状态:R 运行,S 可中断睡眠,D 不可中断睡眠,T 已暂停,Z 僵尸进程,I 空闲内核线程
- %CPU – CPU 使用率
- %MEM – 物理内存使用率
- TIME+ – 进程累计占用 CPU 的时间
- COMMAND – 进程对应的命令或程序名
然后我们就可以用 ↑ ↓ 和 PGUP PGDN,来滚动和翻页整个表格了,除此之外,还可以输出大写 P 以 CPU 占用排序,输入大写 M 以内存占用排序。
(2)htop 工具
htop 相当于加强版的 top,它的界面更美观易用,同时功能也更强大,一般来说我更喜欢用 htop。首先安装它:sudo apt install htop -y
使用 htop 命令即可打开任务管理器,打开后用 q 或 Ctrl + C 退出。htop 会占满终端并自动刷新,界面如下:

可以发现,htop 最明显的区别就是界面更美观了,还有一个区别就是 htop 不仅可以纯键盘操作,还可以用鼠标操作。例如可以用滚轮来滚动进程列表,点击表头可以切换排序列以及排序方向,点击下方的按钮可以选择功能。
因此 htop 的使用难度就很低了,这里简单介绍一下两个常用的功能:
- 搜索:按 F3 或者鼠标点击 Search 按钮,接着就可以用关键字搜索进程了。
- 中止:高亮选中一行进程后按 F9 或者鼠标点击 Kill 按钮,会进入信号发送界面,选择 15 SIGTERM 发送来请求中止进程,或者发送 9 SIGKILL 来强制中止进程。
进程中止 kill /pkill
上一节介绍的 htop 已经有中止进程的功能了,不过 Linux 自身也有专门的命令。
(1)kill 命令:杀死指定 ID 进程
使用 kill 进程ID 来杀死进程,进程 ID 可以通过 top 或者 htop 查到。
kill 默认发送 SIGTERM 即请求中止进程,如果进程已经完全卡死不响应,可以发送 SIGKILL 来强制中止进程,使用 kill -9 进程ID
#通过PID杀进程,PID来自top/htop
kill 12345
#强制杀死卡死进程 SIGKILL
kill -9 12345
(2)pkill 命令:杀死指定正则表达式的进程
使用 pkill 正则表达式 来杀死进程,所有进程名匹配上正则表达式的进程都会被一起杀死,因此可能一次杀多个。
pkill 默认匹配进程名,如果想匹配完整的启动命令,可以使用 -f 参数,例如:
pkill -f "python.*train.py"
同样,pkill 默认发送 SIGTERM 即请求中止进程,如果进程已经完全卡死不响应,可以发送 SIGKILL 来强制中止进程,使用 pkill -9 正则表达式
#pkill按进程名字匹配批量杀进程
pkill -f "python train.py"
pkill -9 -f "python train.py"
磁盘相关
(1)du(disk usage):统计目录 / 文件实际占用磁盘大小
-s 参数表示只显示汇总结果,不每行列出所有对象的大小,-h 参数让容量自动使用 KB、MB、GB 等易读单位。du -sh 的调用方式基本上是最常用的固定搭配:
# -s汇总,-h人类可读单位KB/MB/GB
du -sh /var/log # 查看一个目录的总大小
du -sh /var/log/* # 查看一个目录下所有对象的大小
(2)df:查看整个文件系统挂载分区剩余空间
-h 参数让容量自动使用 KB、MB、GB 等易读单位,因此最常使用的是:
df -h
(3)lsblk:查看机器全部磁盘、分区和挂载关系(找 U 盘新硬盘)
lsblk
输出类似:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 499G 0 part /
sdb 8:16 0 2T 0 disk
└─sdb1 8:17 0 2T 0 part /data
示例:

其中重要的列有:
- NAME – 设备名称
- SIZE – 容量
- TYPE – 类型,例如 disk 为整块磁盘,part 为分区
- MOUNTPOINTS – 挂载位置
(4)iotop 工具:查询磁盘 I/O
有时候磁盘空间并没有满,但系统仍然非常卡,这可能是某个程序正在大量读写磁盘。此时可以使用 iotop 查看各进程的磁盘读写情况。
//安装
sudo apt install iotop
//运行
sudo iotop
它的使用方式和 top 类似,会实时显示各进程的磁盘读写速度。其中主要关注:
- DISK READ – 磁盘读取速度
- DISK WRITE – 磁盘写入速度
- COMMAND – 对应的程序
按方向键可以导航,按 q 可以退出。
网络状态查看
(1)ifconfig 命令:查询网络接口
ifconfig 可以查看计算机的网络接口、IP 地址以及网络流量等信息。
#ifconfig查看网卡ip(旧工具)
sudo apt install net-tools
#运行
ifconfig
示例:

现代系统替代 ifconfig 命令:ip addr
这里最常关注的是:
- eth0 – 网络接口名称(一般物理网口以 eth, ens, eno, enp 开头)
- inet – IPv4 地址和子网掩码
- inet6 – IPv6 地址和前缀长度
- RX – 接收的数据包累计数量和累计大小
- TX – 发送的数据包累计数量和累计大小
另外,ifconfig 是比较经典的工具,现在较新的 Linux 系统主要使用 ip 命令代替它,使用 ip addr 命令的效果和 ifconfig 类似。
(2)iftop 工具:查询网络连接流量
如果想知道“到底是哪个远程地址正在占用网络”,可以使用 iftop。
# 安装
sudo pat install iftop -y
#运行
sudo iftop
iftop 会实时显示本机与其他地址之间的网络连接以及对应流量,因此比较适合排查:
- 哪个服务器正在大量传输数据
- 当前主要连接到了哪些地址
- 哪条网络连接占用了最多带宽
如果计算机有多个网卡,可以指定网络接口:
sudo iftop -i eth0
按 q 退出。
(3)nload 工具:查询网卡总流量
如果并不关心具体是哪个连接,只想看看当前总下载和上传速度,那么 nload 会更加直观。
#安装
sudo apt install nload -y
#运行
nload
界面中会分别显示:
Incoming
当前下载速度
Outgoing
当前上传速度
如果计算机存在多个网络接口,可以使用 ← 和 → 切换。按 q 退出。
2.7 磁盘挂载 mount /umount
什么是挂载?
对于 Windows 用户来说,挂载是很陌生的概念。因为 Windows 如果接入了新磁盘,格式化后就直接显示为新盘符了(例如 E:\\ 盘)。
Linux 没有 Windows 盘符概念;磁盘必须挂载到某个目录节点才能访问。 桌面版 Ubuntu 插入 U 盘自动挂载;服务器版不会自动挂载,需要手动操作。
看到下图示例,假如一台计算机有两块磁盘分别为 A 和 B,我们可以让 A 磁盘储存根目录,称为系统盘,可以让 B 磁盘仅储存用户的用户文件,成为用户盘。那么,就可以将 B 磁盘的文件系统挂载到 /home 目录下,这样,所有储存在 /home 目录里面的内容,实际写入的磁盘是 B,而其他的目录均写入磁盘 A。

本节主要讲可移动设备(例如U盘、移动硬盘)的挂载和卸载。
挂载磁盘
插入设备后,可以先使用前面介绍过的 lsblk 查看,例如:
NAME SIZE TYPE MOUNTPOINTS
sda 500G disk
└─sda1 500G part /
sdb 64G disk
└─sdb1 64G part
这里 /dev/sda1 已经挂载到根目录 /,而新插入的 /dev/sdb1 的 MOUNTPOINTS 为空,说明它还没有挂载。
注意,通常需要挂载的是磁盘中的分区,例如 /dev/sdb1,而不是整块磁盘 /dev/sdb。
#1.先lsblk确认设备,例如新U盘分区 /dev/sdb1
#2.创建挂载点空目录
sudo mkdir -p /mnt/usb
#3.挂载分区到目录,使用mount
sudo mount /dev/sdb1 /mnt/usb
#4.用完卸载!!拔出U盘前必须umount,防止数据损坏
#注意命令是umount,不是unmount!!
sudo umount /mnt/usb
踩坑提示:卸载提示target is busy,说明有终端或者程序还在进入这个挂载目录,切到别的目录再卸载。
2.8 环境变量
在 Linux 的安装教程、软件配置和开发环境中,经常可以看到下面这样的命令:
export PATH="/opt/myapp/bin:$PATH"
export LD_LIBRARY_PATH="/opt/myapp/lib:$LD_LIBRARY_PATH"
export CUDA_VISIBLE_DEVICES=0,1,2,3
这些命令都与环境变量有关。本节将简单介绍环境变量是什么,并重点介绍两个非常常见的特殊环境变量:PATH 和 LD_LIBRARY_PATH。
export 设置环境变量
普通 Shell 变量默认只属于当前 Shell。从当前 Shell 启动其他程序时,这些程序并不会自动获得普通变量。
如果希望变量能够传递给当前 Shell 启动的程序,可以使用 export 将其导出为环境变量:
#导出环境变量
export MY_VAR="hello world"
#查看全部环境变量
env
#临时只对这一条命令生效,不改变全局环境
CUDA_VISIBLE_DEVICES=0 python train.py
简单理解:
- 普通变量:主要供当前 Shell 自己使用。
- 环境变量:除了当前 Shell 可以使用,还会传递给它启动的子进程。
可以使用 env 查看当前环境中的所有环境变量
环境变量的用法和普通 Shell 变量类似,在上篇文章的 1.7节 已经讲过。不过有一个用法需要注意,环境变量既可以设置到当前 Shell 的环境中(重启 Shell 后失效),并传递给之后启动的子进程,也可以临时仅给某个命令使用。临时使用的语法为:
MY_ENV=my-env-value 要运行的命令
例如在 Python 人工智能训练中极为常见的指定计算卡的用法,就是临时设定的环境变量:
CUDA_VISIBLE_DEVICES=0 python train.py
PATH(最重要环境变量)
PATH 是 Linux 中最重要的环境变量之一,它决定了 Shell 去哪些目录寻找命令。
使用 echo $PATH 查看当前的 PATH,将会显示一个使用冒号 : 分隔的目录列表
如果要新增一个 PATH 目录,可以用下面的命令。请注意一定不要覆盖 PATH,而是用冒号拼接,因为如果直接覆盖 PATH 会导致其他大多数命令 Shell 全部都找不到了。
可以使用 which 查看某个命令实际对应的位置:which ls。一般来说会输出:/usr/bin/ls。即 Shell 通过遍历 PATH 后,在 /usr/bin/ls 找到了 ls 命令。
例如:
#查看PATH
echo $PATH
#千万不要直接PATH=xxx会把系统命令全部搞丢!!!追加写法
export PATH="/opt/myapp/bin:$PATH"
#which查看命令实际程序位置
which ls
另外,PATH 中越靠前的目录优先级越高。如果不同目录中存在同名命令,Shell 通常会优先找到排在前面的那个。
LD_LIBRARY_PATH 动态库路径
很多 Linux 程序并不是把所有功能都包含在自己的可执行文件中,而是运行时还需要加载一些动态链接库,当程序运行时需要找到这些库文件,而这类动态链接库文件通常以 .so 结尾动态库,这个变量告诉系统去哪里找库文件,例如:
libexample.so
libexample.so.1
如果说上一节的 PATH 是告诉 Shell 到哪些目录寻找可执行程序,那么 LD_LIBRARY_PATH 就是告诉动态链接器到哪些额外目录寻找动态链接库。
#正确设置 LD_LIBRARY_PATH 后,程序就可能正常找到对应的库。
export LD_LIBRARY_PATH="/opt/myapp/lib:$LD_LIBRARY_PATH"
#ldd查看程序依赖哪些动态库
ldd /usr/bin/ls
与 PATH 类似,LD_LIBRARY_PATH 中也可以包含多个目录,使用 : 分隔,并且靠前的目录具有更高的查找优先级:
export LD_LIBRARY_PATH="/path/a:/path/b:$LD_LIBRARY_PATH"
2.9 Bash 配置文件~/.bashrc source
在前面的内容中,我们已经接触过环境变量、命令别名等配置。不过如果只是在终端直接写 export、alias,关闭终端时就会全部失效;写进.bashrc每次打开终端会自动加载。
.bashrc 是什么?
.bashrc位于家目录,~/.bashrc,它的文件名以 . 开头,因此它属于隐藏文件,可以使用 ll 别名或者 ls -al 查看它。
.bashrc 本质上就是一份 Shell 脚本。每次启动交互式 Bash 时,Bash 通常会读取并执行其中的内容。因此,平时可以直接在 Bash 中执行的很多配置命令,也可以写进 .bashrc,让它们以后自动执行。
#编辑
nano ~/.bashrc
(1)长期保存环境变量
例如前文介绍过,如果希望将 /opt/myapp/bin 加入 PATH,直接在终端中执行时,只对当前 Shell 生效。如果把这一行加入 ~/.bashrc(位置一般不重要,加到末尾即可):
#环境变量
export PATH="/opt/myapp/bin:$PATH"
这样每次打开Bash时都会执行这条命令。
(2)设置命令别名
我们可以自己设定别名,给一个比较长的命令取一个更短的名字,例如:
#命令别名,简化长命令
alias ll='ls -alF'
alias cac='conda activate'
如果直接在Shell中执行 alias 同样只是临时生效,写入 .bashrc 后,每次打开Bash 都会自动创建这些别名。
不过一般建议 .bashrc 主要用于 Shell 配置,不要在里面加入耗时很长、需要用户输入或者会产生大量输出的命令,否则每次打开 Shell 都会受到影响。
(3)新加载 .bashrc
修改 .bashrc 后,新打开的 Bash 通常会读取新的配置,因此最简单的方法是关闭并重新打开终端。如果不想重新打开终端,也可以让当前 Bash 立即重新执行 .bashrc:
#完整形式
source ~/.bashrc
#简写等同
. ~/.bashrc
小知识:source venv/bin/activate本质就是执行脚本修改当前 shell 环境。
2.10 拾遗补缺
补充几个非常实用、但内容较少的命令。
watch:定时重复执行命令
watch 可以每隔一段时间(默认 2 秒)重复执行某个命令,并不断刷新终端中的显示结果,需要退出时按 Ctrl + C。示例如下:
#每2秒刷新一次看GPU状态
watch nvidia-smi
#-n 指定间隔秒数 du=disk usage 查看磁盘占用 -s 只输出总和
#每隔一秒查看一次output目录有多大
watch -n 1 du -sh ./output
tee:同时输出到终端 + 保存文件
> 重定向只输出文件,屏幕看不到;tee 两者兼顾
不加 -a 的 tee 是覆盖:先清空这个文件,再写入新内容。
#输出会直接进入文件,不显示在终端
ls > files.txt
#输出到终端 + 将内容保存到文件
ls | tee file.txt
#-a追加写入
ls | tee -a file.txt
diff:比较文件差异
diff 可以比较两个文件的内容差异:
#普通对比
diff old.txt new.txt
如果两个文件完全相同,通常不会输出任何内容;如果存在差异,则会显示发生变化的位置和内容。
更常见的统一格式:
#-u统一格式,可读性更高,+新增,-删除
diff -u old.txt new.txt
输出中:
- 以 – 开头的内容表示旧文件中的内容
- 以 + 开头的内容表示新文件中的内容
例如:
-Hello
+Hello World
表示原来的 Hello 被修改成了 Hello World。
uname 查看系统内核信息
直接执行 uname 一般会输出 Linux,即内核名称。通常我们使用 -a 参数打印出完整信息,这样更实用,执行 uname -a 后,我手上的 Ubuntu 24.04.4 LTS 输出以下内容:
#打印完整内核硬件信息
uname -a
#查看Ubuntu发行版本号
cat /etc/os-release
例如:

终端容易误触快捷键汇总
在终端中,有些快捷键可能会因为误触导致看着像“卡住” 或任务突然暂停:
| Ctrl+S | 终端卡住,敲字符无输出 | 按Ctrl+Q恢复输出 |
| Ctrl+Z | 程序暂停挂后台 | 输入fg切回前台 |
| Ctrl+C | 中断正在运行程序,通常无法恢复 | 重新运行命令 |
| Ctrl+D | 直接退出当前 shell | 重新打开 / 重连 ssh |
结语:
本章没有去深挖 inode 原理、进程信号的内核源码,而是优先解决我们平时用服务器最常遇到的痛点:文件怎么高速下载、大文件怎么打包、长时间任务怎么防止断连中断、磁盘满了怎么排查、动态库和 PATH 环境变量该怎么配置。这些工具不是孤立的,在实际工作中经常组合使用:用aria2c下载数据集,tar解压,grep筛选日志,tmux挂起训练,htop和nload监控资源。
学习建议:不要死记硬背,收藏本文,遇到实际业务场景回来复制示例敲一遍。 后面可以自己学习系统服务 systemctl、rsync 同步、防火墙 ufw 等进阶工具。

网硕互联帮助中心




评论前必须登录!
注册