Ubuntu Linux 20 个常用命令参考手册
面向 Linux 初学者的命令参考,按“基础概念 → 命令详解 → 易混辨析 → 综合示例 → 自测”的顺序组织。
| 项目 | 说明 |
|---|---|
| 适用系统 | Ubuntu、Debian 等基于 APT 的 Linux 发行版 |
| Shell | Bash |
| 涵盖范围 | 20 个常用命令 |
| 更新日期 | 2026-10-29 |
目录
| 部分 | 内容 |
|---|---|
| 一 | 20 个命令总览 |
| 二 | 终端、路径、参数与符号基础 |
| 三 | 20 个命令详解 |
| 四 | 易混知识与常见报错 |
| 五 | 综合示例:用 20 个命令完成一个项目 |
| 六 | 自测题与参考答案 |
| 七 | 学习方法与参考资料 |
一、20 个命令总览
下表用于速查。示例中的文件、目录、PID 和服务均为占位符,实际使用时必须替换为系统中真实存在的对象,不能把示例编号当作本机的实际对象。
| 序号 | 命令 | 功能概要 | 代表用法 |
|---|---|---|---|
| 1 | pwd | 显示当前工作目录 | pwd |
| 2 | ls | 列出目录内容 | ls -lah |
| 3 | cd | 切换工作目录 | cd ~/linux_practice |
| 4 | mkdir | 创建目录 | mkdir -p python/day01 |
| 5 | touch | 新建空文件,或更新文件时间戳 | touch main.py |
| 6 | cp | 复制,保留源文件 | cp -i a.txt b.txt |
| 7 | mv | 移动或重命名 | mv -i a.txt backup/ |
| 8 | rm | 删除指定文件 | rm -i test.txt |
| 9 | cat | 输出、拼接文本内容 | cat -n notes.txt |
| 10 | nano | 在终端编辑文本 | nano notes.txt |
| 11 | echo | 输出文字或变量的值 | echo "$HOME" |
| 12 | grep | 在内容中查找匹配行 | grep -in "error" slam.log |
| 13 | find | 按条件查找文件或目录 | find . -type f -name "*.yaml" |
| 14 | less | 分页阅读和搜索文本 | less -N slam.log |
| 15 | chmod | 修改文件权限 | chmod u+x hello.sh |
| 16 | sudo | 经授权,以其他用户身份执行命令 | sudo whoami |
| 17 | apt | 搜索、安装、更新、卸载软件包 | apt show tree |
| 18 | ps | 查看进程快照 | ps -p 1234 |
| 19 | kill | 向进程发送信号 | kill 1234 |
| 20 | systemctl | 查询和管理 systemd 服务等单元 | systemctl status systemd-journald |
这些命令可组合成若干常见操作路线:
定位文件:pwd → ls → cd → find
修改文件:cp 备份 → nano 编辑 → cat 检查
排查日志:grep 筛选 → less 阅读上下文
运行脚本:nano 编写 → chmod 授权 → ./脚本名
管理进程:ps 核对 → kill 发信号 → ps 验证
管理软件:apt 查询 → sudo apt update → sudo apt install
查询服务:systemctl status
二、终端基础
本章介绍使用命令前需要掌握的基础概念:提示符、命令结构、路径、引号与管道。
2.1 命令提示符的结构
Bash 默认提示符的一般形式为:
user@host:~/linux_practice$
| 部分 | 含义 |
|---|---|
user | 当前用户名 |
@ | 用户名与主机名的分隔符 |
host | 主机名 |
~/linux_practice | 当前工作目录的简写 |
$ | 普通用户的提示符;root 账户的默认提示符通常为 # |
输入命令时不需要复制提示符本身。例如只输入:
pwd
提示符可以定制,因此判断当前执行身份时,whoami 比观察 $ 或 # 更可靠。终端是交互窗口,Shell 是解释命令的程序;本文档使用 Bash 语法。cd 属于 Shell 内建命令,ls 等通常由外部程序提供。参考:Bash 手册
2.2 命令的一般组成
命令 选项 操作对象
例如:
ls -l hello.sh
ls 是命令,-l 是选项,hello.sh 是操作对象。并非每条命令都需要这三部分,例如 pwd 可以单独执行。
选项不能凭习惯改写。
ls -l与ls l含义不同;ps aux采用不带短横线的 BSD 风格选项,并非所有命令的选项都需要加-。各命令支持的语法应分别查阅手册。参考:ls、ps
2.3 路径与常用符号
| 写法 | 含义 | 示例 |
|---|---|---|
/ | 根目录;在路径内部也作分隔符 | /home/username |
~ | Bash 中未加引号时展开为当前用户主目录 | cd ~ |
. | 当前目录 | find . -type f |
.. | 上一级目录 | cd .. |
./文件名 | 指定当前目录中的文件 | ./hello.sh |
> | 将标准输出写入文件,默认覆盖已有内容 | echo "A" > a.txt |
>> | 将标准输出追加到文件末尾 | echo "B" >> a.txt |
$变量名 | 取变量的值 | echo "$HOME" |
& | 将命令放到后台运行 | sleep 600 & |
绝对路径从 / 开始,例如 /home/username/ros2_ws。相对路径从当前目录出发,例如 src/slam.py。~/ros2_ws 并非以 / 开头的字符串,但 Bash 展开 ~ 后得到的是主目录下的路径。参考:路径解析、Bash
2.4 含空格的路径要使用引号
路径或参数中包含空格时,必须用引号保护,否则会被拆分为多个参数:
cd "$HOME/My Documents"
echo "$HOME"
echo '$HOME'
前者输出变量的值,例如 /home/username;后者输出字面文字 $HOME。双引号通常允许变量展开,单引号保留其中字符的字面意义。参考:Bash
2.5 管道
ps aux | grep '[s]lam_toolbox'
中间的 | 是管道,把左侧命令的标准输出作为右侧命令的输入。上例的含义是“列出进程 → 筛选匹配行”。
管道和重定向由 Shell 处理,不是 ps、grep、echo 独有的参数。普通 | 不会自动把标准错误一并传递。参考:Bash、重定向
三、20 个命令详解
本章按序号依次介绍 20 个命令。每个命令包含用途、常用选项、示例与注意事项;示例中的路径与账号均为占位符,实际使用时须替换为本机对象。
01|pwd:显示当前目录
英文全称:Print Working Directory。
pwd
输出形如:
/home/username
它显示当前工作目录,而不是当前目录中包含哪些文件。参考:pwd 手册
示例:
cd ~/linux_practice
pwd
预期输出:
/home/username/linux_practice
使用习惯: 修改、移动、删除文件之前,先用
pwd确认位置。使用相对路径时,不同工作目录会使同一条命令指向不同对象。
02|ls:列出文件和目录
英文全称:List。 默认列出指定目录的可见条目;不指定对象时查看当前目录。以 . 开头的名称默认不显示。参考:ls 手册
| 用法 | 作用 |
|---|---|
ls | 列出当前目录的可见内容 |
ls -l | 详细列表 |
ls -a | 包括隐藏条目以及 .、.. |
ls -lh | 详细列表,并以易读单位显示大小 |
ls -lah | 组合使用 -l、-a、-h |
ls -ld lesson04 | 查看 lesson04 目录本身的信息 |
ls -l lesson04 | 查看 lesson04 内部可见内容的信息 |
一行输出的结构
-rw-rw-r-- 1 username username 13 Oct 27 09:54 cp_backup.txt
| 内容 | 含义 |
|---|---|
-rw-rw-r-- | 类型和权限 |
1 | 硬链接数量 |
第一个 username | 所有者 |
第二个 username | 所属组 |
13 | 文件大小,默认以字节计 |
Oct 27 09:54 | 默认显示的内容修改时间 |
cp_backup.txt | 文件名 |
第一个字符为 - 表示普通文件,为 d 表示目录。其后九位权限分三组,详见第 15 节。
三个容易误读的地方:
- 目录显示的
4096或4.0K是目录本身的大小,不是内部所有文件大小之和。 total是当前所列条目占用磁盘块的合计,不是所有子目录的递归总大小;显示单位还受选项和环境影响。- 默认显示的修改时间不是“文件创建时间”。参考:GNU Coreutils
03|cd:切换工作目录
英文全称:Change Directory。 它改变当前 Shell 的工作目录,不会移动文件。参考:Bash 的 cd
| 命令 | 作用 |
|---|---|
cd ~/ros2_ws | 进入主目录下的 ROS 2 工作空间 |
cd /home/username/ros2_ws | 用绝对路径进入同一目录 |
cd ros2_ws | 从当前位置进入名为 ros2_ws 的子目录 |
cd .. | 返回上一级目录 |
cd ~ | 返回主目录 |
cd | 未给目录时,通常返回 $HOME |
cd - | 回到上一次工作目录,并通常输出该路径 |
cd / | 进入根目录 |
示例:
cd ~/ros2_ws
pwd
cd ..
pwd
cd -
前两个 pwd 依次应显示:
/home/username/ros2_ws
/home/username
重点:
cd ..不等于cd ~。 只有当当前位置恰好是主目录的直接子目录时,两者才可能到达同一位置。
04|mkdir:创建目录
英文全称:Make Directory。
mkdir lesson04
在当前目录中创建 lesson04。成功时通常没有提示;存在同名目录时,普通 mkdir 会报错。参考:mkdir 手册
创建多级目录:
mkdir -p python/day01
-p 会补建缺失的父目录;目标目录已存在时,不会仅因“目录已存在”而报错。若路径中存在同名普通文件或缺少权限,仍然可能失败。
示例:
cd ~/linux_practice
mkdir -p mkdir_review/a/b
ls -ld mkdir_review mkdir_review/a mkdir_review/a/b
验证关键:
mkdir负责创建,ls -ld 目录名负责检查。
05|touch:创建空文件或更新时间
touch 的主要功能是更新时间戳。未指定其他选项时,文件不存在则创建空文件;文件存在则更新访问时间和修改时间,不会清空已有内容。参考:touch 手册
touch main.py
touch test1.txt test2.txt test3.txt
第二条命令一次处理三个文件。
touch main.py readme.txt
ls -l
此时两个普通文件大小均为 0,表示创建的是空文件。
对照记忆:
| 需求 | 命令 |
|---|---|
| 新建目录 | mkdir project |
| 新建空文件 | touch main.py |
| 给文件写入内容 | nano main.py,或适当使用输出重定向 |
.py 后缀不会自动生成 Python 代码,也不会使 touch 运行该文件。
补充:stat 文件名 可显示更完整的元数据。Modify 是内容修改时间,Access 是访问时间,Change 是状态变更时间,不是创建时间。参考:GNU Coreutils
06|cp:复制文件或目录
英文全称:Copy。 基本顺序是“源 → 目标”。参考:cp 手册
cp cp_source.txt cp_backup.txt
目标不存在且复制成功后,源文件仍然保留,新文件具有复制所得的内容。对普通文件执行复制后,编辑备份文件不会自动同步修改源文件。
复制到目录
目标目录须已存在:
cp -i cp_source.txt backup/
-i 仅在将要覆盖已有目标文件时询问,并非每次复制都询问。
复制整个目录
cp -r lesson04 lesson04_backup
-r 表示递归处理内部内容。目标路径的状态决定结果:
| 执行前状态 | 通常结果 |
|---|---|
lesson04_backup 不存在 | 创建该目录并放入复制内容 |
lesson04_backup 已经是目录 | 在其内部复制出 lesson04,形成 lesson04_backup/lesson04/ |
不能依赖“目录已存在”提示来判断意图。 已存在的目录通常会成为容纳复制结果的位置,反复执行可能产生嵌套或覆盖。
07|mv:移动或重命名
英文全称:Move。 同一命令既可用于改名,也可用于改变文件位置。参考:mv 手册
| 需求 | 示例 |
|---|---|
| 重命名 | mv -i old_name.txt new_name.txt |
| 移动到已有目录 | mv -i test.txt backup/ |
| 移动并改名 | mv -i test.txt backup/test_backup.txt |
cp与mv的核心区别: 对普通文件,cp成功后源路径仍然存在;mv成功后源路径不再有这个文件。
目标已存在时,普通 mv 可能直接覆盖;mv -i 可在覆盖前确认。目标目录须先行检查,名为 backup 的路径并不自动意味着它是目录。
08|rm:删除文件
英文全称:Remove。 rm 删除指定路径,默认不递归删除目录,也不会将文件移入桌面回收站。参考:rm 手册
rm delete_me.txt
上例删除的是指定的 delete_me.txt,不是“删除当前目录全部内容”。
交互确认
rm -i important.txt
出现询问时:
| 输入 | 含义 | 结果 |
|---|---|---|
y | Yes | 确认删除 |
n | No | 不删除该文件 |
-i只是增加询问,不是禁止删除。
安全示例
cd ~/linux_practice/rm_practice
pwd
touch keep_review.txt
rm -i keep_review.txt
询问时输入 n 并回车,随后执行:
ls -l keep_review.txt
应仍能看到该文件。
-r 会处理目录树,-f 会跳过确认并忽略某些不存在的目标。初学者不应把它们与宽泛通配符随意组合,更不应加 sudo 用于试错。
09|cat:显示或拼接文件内容
英文全称:Concatenate,连接。 按参数顺序将内容写到标准输出,通常即终端。参考:cat 手册
| 用法 | 作用 |
|---|---|
cat notes.txt | 输出一个文件的内容 |
cat a.txt b.txt | 依次输出两个文件的内容 |
cat -n notes.txt | 为所有输出行编号,包括空行 |
示例:
cat -n notes.txt
两个细节
查看空文件时没有正文输出,不代表命令失败。
拼接时,cat 不会自动在两个文件之间补换行。只有前一个文件本身以换行符结束,下一个文件的内容才会自然出现在下一行。
cat查看脚本不会执行脚本,也不会修改其内容。
10|nano:在终端编辑文本
nano 是文本编辑器,可编辑 .txt、.py、.sh、.yaml 等文本文件。参考:Nano 官方快捷键
nano notes.txt
文件存在时打开其内容;文件不存在时进入新的编辑缓冲区,完成保存后才写入磁盘。
保存和退出
Ctrl + O → Enter → Ctrl + X
| 操作 | 作用 |
|---|---|
Ctrl + O | 发起写入,提示确认文件名 |
Enter | 确认名称并保存 |
Ctrl + X | 关闭当前编辑缓冲区;单文件场景下退出 |
界面中的 ^O 表示 Ctrl + O,这里是字母 O,不是数字 0。不同版本或配置的其他快捷键可能不同,应以底部提示和帮助为准。
存在未保存修改时,按 Ctrl + X 通常会询问是否保存:选择 N 放弃修改,选择 Y 则继续保存流程。关闭终端不等同于保存。
11|echo:输出文字与变量值
echo 将参数输出,通常在末尾添加换行。$HOME 之类的表达式由 Shell 先展开,再交给 echo 输出。参考:Bash 的 echo
echo "Hello Linux"
echo "$HOME"
echo "$XDG_CURRENT_DESKTOP"
后两条命令在 Ubuntu 桌面会话中的典型输出为:
/home/username
ubuntu:GNOME
前者是主目录;后者是桌面会话提供的标识。不能仅凭该变量推断具体的 Ubuntu 或 GNOME 版本。
覆盖与追加
echo "First line" > message.txt
echo "Second line" >> message.txt
cat -n message.txt
预期输出:
1 First line
2 Second line
| 符号 | 文件不存在时 | 文件已存在时 |
|---|---|---|
> | 在父目录存在且有权限时创建 | 默认先清空,再写入 |
>> | 在父目录存在且有权限时创建 | 从末尾追加,不清空原内容 |
这些符号属于 Shell 的重定向语法,不是 echo 的专属选项。重定向通常在命令运行前处理,因此使用 > 前必须确认目标。参考:Bash 重定向
示例:
cd ~/linux_practice/echo_practice
echo "I am learning Linux." > echo_review.txt
echo "I am learning ROS2." >> echo_review.txt
echo "I am learning SLAM." >> echo_review.txt
cat -n echo_review.txt
第一条写入命令会重写目标文件,仅在允许覆盖时执行。反复执行 >> 会反复追加,不会自动去重。追加操作也不会主动修补原文件缺失的末尾换行。
关于 13 字节: Hello Ubuntu 共 12 个 ASCII 字符,普通 echo 另加 1 个换行字节,因此显示 13 字节。不能据此推断“所有文字都是一个字符一字节”,中文等字符在 UTF-8 中可能占用多个字节。
12|grep:从内容中筛选匹配行
基本写法:
grep "模式" 文件名
默认输出匹配的整行,并区分大小写。严格说,默认使用基本正则表达式;像 ERROR 这样不含特殊语法的简单模式,可以先按关键词理解。参考:grep 手册
示例日志
以下为用于演示的模拟日志 slam.log:
[INFO] LiDAR connected
[WARN] Scan frequency low
[ERROR] TF map to odom missing
[INFO] Mapping started
[error] Motor driver timeout
| 命令 | 结果 |
|---|---|
grep "ERROR" slam.log | 只匹配大写 ERROR 那一行 |
grep -i "error" slam.log | 匹配大小写两种错误行 |
grep -n "WARN" slam.log | 匹配警告行,并显示行号 2: |
grep -in "error" slam.log | 匹配错误行,并显示行号 3:、5: |
-i 表示忽略大小写;-n 表示显示源文件行号;-in 等价于 -i -n。
示例:
cd ~/linux_practice/grep_practice
grep "INFO" slam.log
grep -n "WARN" slam.log
grep -in "error" slam.log
最后一条的预期输出:
3:[ERROR] TF map to odom missing
5:[error] Motor driver timeout
补充:字面搜索与上下文
以下写法并非必背项,但有助于避免误用:
grep -F "[ERROR]" slam.log
grep -in -C 2 "error" slam.log
-F 按普通字符串搜索,适合查找带方括号等符号的文字;否则 [ERROR] 在正则表达式中另有含义。-C 2 同时显示匹配行前后各两行。因此 grep 也能查看上下文,只是 less 更适合自由浏览。参考:grep 手册
没有匹配时通常没有正文输出,不等于文件损坏。应区分“没有匹配”与“找不到文件”两种情况。
13|find:按条件查找文件或目录
基本写法:
find 搜索起点 条件
find 从给定起点遍历目录树,不仅检查当前这一层。参考:find 手册
| 用法 | 作用 |
|---|---|
find . -type f | 查找当前目录树中的普通文件 |
find . -type d | 查找目录,当前目录本身也可能匹配 |
find . -type f -name "*.py" | 查找以 .py 结尾的普通文件 |
find . -type f -name "*.yaml" | 查找以 .yaml 结尾的普通文件 |
find src -type f -name "*.py" | 只在 src 及其子目录中查找 |
f 表示普通文件,d 表示目录。-name 匹配名称,默认区分大小写。省略 -type f 时,名称以 .py 结尾的目录也可能被匹配。
示例
cd ~/linux_practice/find_practice
find . -type f -name "*.py"
输出示例:
./src/lidar.py
./src/slam.py
./main.py
而:
find src -type f -name "*.py"
只输出:
src/lidar.py
src/slam.py
main.py 不在 src 中,因此不属于后者的搜索范围。结果顺序不必与示例一致。
为什么 "*.py" 要加引号
引号的目的是把 *.py 这个匹配模式交给 find,而不是让 Shell 先将其展开为当前目录中的文件名。* 在这里表示名称中任意长度的字符序列。参考:find 手册
记忆:
grep搜内容,find按条件找路径。
14|less:分页查看和搜索
less slam.log
less -N slam.log
less 适合阅读长文本;大写 -N 显示行号。普通浏览不会修改原文件。参考:less 手册
进入后,键盘操作作用于阅读器,而非在 Shell 中执行命令。
| 按键 | 作用 |
|---|---|
| 空格 | 向下翻一屏 |
b | 向上翻一屏 |
g | 回到开头 |
G,即 Shift + G | 跳到末尾 |
/关键词,再按 Enter | 朝文件末尾方向搜索 |
n | 沿上一次搜索方向寻找下一处匹配 |
N | 沿相反方向寻找匹配 |
q | 退出阅读器 |
示例
seq 1 120 > long.txt
less -N long.txt
seq 仅用于生成 1 到 120、每行一个数字的文本。进入后可输入 /80 定位到对应内容,按 G 跳到文件末尾。
与 grep 搭配
grep -in "error" slam.log
less -N slam.log
前者适合快速筛选,后者便于向前后翻阅。
注意:不能默认认为 less 中的 /ERROR 与 grep -i "error" 使用相同的大小写规则。常规默认配置下搜索区分大小写,环境选项也可能改变行为。
15|chmod:修改权限
英文全称:Change Mode。 chmod 修改权限位,不是修改文件内容,也不是把文件转换成程序。参考:chmod 手册
权限字符串的结构
-rwxr-xr--
│└─┬┘└─┬┘└─┬┘
│ u g o
│
└─ 普通文件
| 部分 | 含义 |
|---|---|
开头的 - 或 d | 普通文件或目录 |
u:第一组三位 | 文件所有者 |
g:第二组三位 | 所属组中的其他用户 |
o:第三组三位 | 其他用户 |
r | 读取 |
w | 写入 |
x | 执行;对目录为搜索、遍历权限 |
组内的 - | 不具备该项权限 |
符号权限
chmod u+x hello.sh
chmod u-x hello.sh
前者增加所有者的执行权限,后者移除它;所属组和其他用户的权限不因此改变。
| 写法 | 含义 |
|---|---|
u / g / o / a | 所有者 / 所属组 / 其他用户 / 三类全部 |
+ | 增加指定权限 |
- | 移除指定权限 |
= | 将相应类别的权限设置为指定组合 |
数字权限
每一组分别相加:
r = 4
w = 2
x = 1
rwx = 7
rw- = 6
r-x = 5
r-- = 4
--- = 0
| 数字 | 权限 | 用于普通文件时的含义 |
|---|---|---|
755 | rwxr-xr-x | 所有者读写执行,组和其他用户读执行 |
644 | rw-r--r-- | 所有者读写,组和其他用户只读 |
600 | rw------- | 只有所有者具备读写权限 |
777 | rwxrwxrwx | 三类用户都有读写执行权限 |
chmod 644 是设置这三组权限,不是在原有权限上“加 644”。最前面的文件类型字符不包含在这三个数字中。参考:chmod 手册
文件权限与目录权限的区别
| 权限 | 对普通文件 | 对目录 |
|---|---|---|
r | 读取内容 | 读取目录条目名称 |
w | 修改内容 | 修改目录条目,实际创建、删除等通常还需 x |
x | 允许作为程序执行 | 搜索、遍历目录,访问已知名称的条目 |
删除文件主要涉及父目录的写入、遍历权限等条件,而不是只看文件自身有无 w。实际访问还受父目录、ACL、特殊属性等机制影响。参考:权限结构、路径解析
因此,不能简单认为“目录有 777,任何人都一定能从任意位置进入”。它确实给该目录设置了很宽松的基本权限,不应作为遇到权限错误时的默认解决办法。
权限变更示例
脚本内容:
#!/bin/bash
echo "Hello Linux!"
权限变化过程:
初始 -rw-rw-r--
chmod u+x hello.sh -rwxrw-r--
chmod u-x hello.sh -rw-rw-r--
chmod 755 hello.sh -rwxr-xr-x
chmod 644 hello.sh -rw-r--r--
具备合适权限且环境允许时:
./hello.sh
输出:
Hello Linux!
./ 指当前目录;脚本第一行 #!/bin/bash 指定直接执行时使用的解释器。
移除执行权限后,不能照常直接运行 ./hello.sh;但在可读取脚本且能执行 Bash 的条件下,仍可:
bash hello.sh
此时是 Bash 读取文件内容并解释执行。赋予 x 也不保证任意文件都能运行,文件格式、解释器路径、挂载选项等仍有影响。参考:Bash
chmod 改变权限通常会更新状态变更时间 ctime,不改变内容修改时间 mtime,因此 ls -l 中的时间不变属正常现象。参考:GNU Coreutils
16|sudo:经授权,以其他用户身份执行命令
sudo 允许获授权用户按照安全策略,以另一用户身份执行指定命令;Ubuntu 常见配置中默认目标为 root。它不等于“任何人都能获得管理员权限”。参考:sudo 手册
whoami
sudo whoami
whoami
输出示例:
username
root
username
中间的命令以 root 身份运行,不会把当前普通 Shell 永久切换为 root。
密码与授权
常见配置下,提示输入的是当前用户自己的登录密码;输入时默认不回显字符。存在有效认证缓存或策略允许时,也可能不再询问。密码不应复制到聊天记录或文档中。
使用原则
编辑个人文件、进入目录等日常操作,不需要因为在 Ubuntu 上操作就加 sudo。安装系统软件等管理操作通常需要:
sudo apt update
权限不足时,应先判断路径、所有者和所需权限,而不是直接尝试 sudo。sudo -i、sudo -s 等启动高权限 Shell 的用法与单条命令不同,应另行了解其影响。
17|apt:管理软件包
apt 提供面向交互使用的软件包管理接口。查找、查看通常不需要 sudo;写入系统软件包状态的操作通常需要管理员权限。参考:APT 手册
| 命令 | 作用 |
|---|---|
apt --version | 查看本机 APT 版本 |
apt search tree | 搜索匹配的软件包,结果可能不止一个 |
apt show tree | 查看包信息、依赖及说明 |
sudo apt update | 刷新配置软件源的软件包索引 |
sudo apt install tree | 安装指定包;已安装时也可能升级该包 |
apt list --installed tree | 查看安装状态 |
sudo apt upgrade | 安装可用升级;必要时可新增依赖,但不为升级移除已安装包 |
sudo apt remove tree | 卸载软件包,通常保留包管理的部分配置 |
update刷新索引,upgrade才进行软件包升级。update不是升级所有已安装软件。
安装后可通过以下命令确认状态,输出中会带 [已安装] 标记:
apt list --installed tree
具体版本号取决于本机的软件源与发行版,其他系统不必与此一致。
tree 的基本用法
tree -L 2 ~/linux_practice
-L 2 限制展示深度。输出末尾会给出目录和文件数量统计,该统计仅针对本次列出的范围,不能理解为包含所有未展开层级和隐藏文件的完整递归总数。参考:tree 手册
安装时的检查
联网刷新索引报错时,应先查看具体来源和错误,不要直接修改软件源。安装前应阅读将新增、升级或移除的包。不应为练习随意执行全系统升级或卸载开发依赖;这也不意味着永远不更新,正常维护应安排好备份、兼容性验证和更新时机。
18|ps:查看进程快照
英文全称:Process Status。 ps 显示查询时刻选定进程的信息,不是持续刷新的界面。参考:ps 手册
| 命令 | 作用 |
|---|---|
ps | 默认查看同有效用户、同终端的一组进程 |
ps aux | 查看当前可见的系统进程,采用用户导向的详细格式 |
ps -p 1234 | 按指定 PID 查询 |
ps -p $$ -o pid,ppid,stat,comm | 查看当前 Shell 的指定字段 |
1234 只是示例编号,实际使用时必须替换为真实 PID。
| 字段 | 含义 |
|---|---|
PID | 进程编号 |
PPID | 父进程编号 |
TTY | 关联终端;? 常表示没有控制终端 |
STAT | 状态及附加标志 |
TIME | 累计 CPU 时间,不是从启动到现在的墙钟时间 |
%CPU | 进程生命周期内 CPU 时间与存活时间的比值等统计,不是瞬时实时读数 |
%MEM | 驻留内存相对物理内存的比例 |
COMM / COMMAND | 命令名或带参数的命令行,取决于输出格式 |
STAT 中 S 通常表示可中断睡眠,R 表示运行或可运行;小写 s 表示会话首进程。它们不是错误编号。参考:ps 手册
查询测试进程
在同一终端依次执行:
sleep 120 &
test_pid=$!
echo "$test_pid"
ps -p "$test_pid" -o pid,ppid,stat,comm
sleep 等待 120 秒后结束;& 将命令放入后台;$! 取得最近放入后台的任务 PID;$$ 则表示当前 Shell 的 PID。赋值时 test_pid=$! 的等号两侧不能加空格。参考:Bash 特殊参数
与 grep 联合使用
ps aux | grep '[s]lam_toolbox'
该命令筛选命令行中匹配的进程;[s] 在正则表达式中匹配字符 s,这种写法通常避免匹配搜索用的 grep 自身。没有输出表示当前没有匹配的进程,无需为此启动真实机器人程序。
后台运行不等于自动成为服务,也不保证关闭终端后继续运行。
19|kill:向进程发送信号
kill 的本质是发送信号,并非所有用法都会强制结束进程。参考:kill 手册
| 写法 | 含义 |
|---|---|
kill PID | 默认发送 SIGTERM,请求结束 |
kill -15 PID | 发送 SIGTERM |
kill -9 PID | 发送 SIGKILL,强制终止 |
kill -0 PID | 不实际发送信号,只做存在性和发送权限检查 |
表中的 PID 是占位符,不能直接使用。
SIGTERM 可以被程序处理或忽略;SIGKILL 不能由程序捕获或忽略,程序也没有机会执行自己的退出清理。Ctrl + C 在常规终端设置下向前台进程组发送 SIGINT,并非所有程序都必定因此退出。参考:Linux 信号
安全示例
仅在同一个终端中对刚创建的 sleep 操作:
sleep 600 &
test_pid=$!
echo "$test_pid"
ps -p "$test_pid" -o pid,stat,args
先确认查询结果是自己刚启动的 sleep 600,再执行:
kill "$test_pid"
ps -p "$test_pid" -o pid,stat,args
通常第二次查询不再显示该进程记录,可能只剩表头。发送信号与进程完全退出之间可能有很短延迟,必要时再查询一次。
不应使用很久以前记录的旧 PID 直接终止进程,PID 可能已被复用;也不应照抄教程中的示例数字去结束真实进程。
对于手动启动的 ROS 2 程序,应先在原终端尝试 Ctrl + C;需要进一步处理时核对 PID。对于由服务管理器托管的程序,单独终止进程还可能触发自动重启,应先了解其管理方式。
20|systemctl:查询和管理服务
本节介绍核心概念与只读查询方法。
systemctl 用于查询、控制 systemd 管理的服务等单元,不是所有进程都能用它管理。参考:systemctl 手册
| 操作 | 含义 |
|---|---|
status | 查看状态 |
start | 现在启动 |
stop | 现在停止 |
restart | 重启;尚未运行时通常会启动 |
enable | 根据单元配置建立自动启用关系,常用于开机启动 |
disable | 移除相应启用关系 |
最安全的查询方式为只读操作:
systemctl status --no-pager systemd-journald.service
systemctl is-active systemd-journald.service
systemctl is-enabled systemd-journald.service
--no-pager 直接输出;未使用该选项而进入分页器时,可按 q 退出。
active (running) 表示正在运行;Main PID 是服务主进程。is-active 的 active 表示活动状态,不保证每种服务都持续有进程,例如某些一次性服务可以是 active (exited)。
start不等于enable,stop不等于disable。 默认情况下,单独启用不会立即启动,单独禁用不会立即停止;被禁用的单元也可能被其他机制拉起。is-enabled输出static不等于报错,通常表示没有可供普通enable使用的安装配置。
停止日志、网络、SSH 或机器人相关服务前,应充分评估影响,不应在未确认后果的情况下操作,也不应随意创建开机自启服务。
四、容易混淆的知识与常见报错
本章集中整理易混参数、常见报错与操作中的安全习惯。
4.1 八组重点对照
| 对照 | 区别 |
|---|---|
pwd / ls / cd | 看位置 / 看内容清单 / 换位置 |
mkdir / touch | 创建目录 / 创建空文件或更新时间 |
cp / mv | 复制保留原件 / 移动或改名 |
cat / nano | 查看文本 / 编辑文本 |
grep / find | 在内容中匹配 / 在目录树中按条件找对象 |
grep / less | 以筛选输出为主 / 以交互浏览为主 |
sudo / chmod | 改变指定命令的执行身份 / 修改目标权限 |
ps / kill / systemctl | 查询进程 / 向进程发信号 / 管理 systemd 单元 |
该表概括前文对应章节,不取代每个命令的具体限制。
4.2 同一个字母在不同命令中的含义不同
| 写法 | 实际意义 |
|---|---|
grep -i | 忽略大小写 |
cp -i、mv -i | 覆盖前询问 |
rm -i | 每次删除前询问 |
grep -n、cat -n | 显示行号 |
less -N | 显示行号,注意大写 |
less 内部按 n | 继续搜索,不是显示行号 |
mkdir -p | 创建缺失的父目录 |
ps -p | 按 PID 选择进程 |
cp -p | 尝试保留相关属性 |
不能把某个参数的含义当作所有 Linux 命令的统一规定。 上表对应的说明见各命令手册。
4.3 错误排查顺序
遇到问题时,应先回答三个问题:当前位置在哪里?目标是否存在?系统正在被要求做什么?
pwd
ls -lah
随后针对实际目标检查:
ls -l 文件路径
ls -ld 目录路径
其中“文件路径”“目录路径”必须替换为真实目标,不能机械照抄。
| 提示或现象 | 常见原因 | 首先应做什么 |
|---|---|---|
No such file or directory | 路径不存在、拼写错误、相对位置不对 | pwd,再 ls |
cannot access 'l' | 把 ls -l 写成 ls l | 补上选项前的 - |
File exists | 普通 mkdir 遇到同名对象 | 用 ls -ld 确认类型,不要直接删除 |
Permission denied | 权限、父目录遍历、挂载等条件不允许 | 检查目标和父目录,不先加 sudo |
command not found | 命令拼错、未安装或不在搜索路径 | 核对名称;本地脚本注意 ./ |
grep 没有正文输出 | 可能没有匹配 | 检查内容、大小写、搜索模式 |
cat 空文件没有输出 | 文件本来没有内容 | ls -l 查看大小 |
cp 报告目录未被复制 | 源是目录但未使用递归选项 | 确认源和目标,再决定是否用 -r |
ps -p 只剩表头 | 进程已结束、不存在或不可见 | 核对 PID 和进程生命周期 |
以上是常见解释,不能仅凭一条错误信息作出唯一诊断;例如 Permission denied 并不总能通过 chmod 解决。参考:路径解析
4.4 安全习惯
涉及文件时,先确认路径。
>会覆盖;>>会重复追加;cp、mv可能覆盖;rm不提供桌面回收站式恢复。重要内容应先备份,练习只使用练习文件。
涉及权限时,按需授予。 不把
777当作万能修复,也不对整个项目盲目递归修改权限。文件和目录的x含义不同。
涉及进程和服务时,先确认对象。 PID 是临时编号,不是永久身份;停止网络、SSH、机器人控制或日志服务前应了解影响。
没有输出不代表失败。
mkdir、touch、chmod等成功时通常不显示正文,应通过ls、cat、ps或状态查询验证结果。
五、综合示例:用 20 个命令完成一个项目
以下示例将 20 个命令串联成一个完整流程。示例脚本只输出几行文本,不启动真实 ROS 2 节点,不控制电机,也不修改真实 SLAM 配置。
环境约定: 文件操作集中于
~/linux_practice/final_review;软件和系统服务只做查询。认证步骤可能产生正常的系统审计记录,但不主动修改系统配置。
5.1 任务分解
| 阶段 | 目标 | 使用命令 |
|---|---|---|
| A | 建立项目,确认位置与目录结构 | mkdir、cd、pwd、ls、touch |
| B | 编写模拟脚本,授予权限并生成日志 | nano、chmod、echo、cat |
| C | 备份和重命名配置文件 | cp、mv |
| D | 查找配置、搜索错误、阅读上下文 | find、grep、less |
| E | 确认删除与取消删除 | rm |
| F | 查询并终止测试进程 | ps、kill |
| G | 验证身份,查询软件和服务 | sudo、apt、systemctl |
A|创建独立练习目录
cd ~/linux_practice
pwd
mkdir final_review
若 final_review 已存在,应先停止操作,检查其中是否有需要保留的文件;如需重新完整执行,应选择一个未使用过的目录名,不要覆盖旧内容。
创建成功后:
cd final_review
mkdir -p src config logs backup
touch notes.txt
pwd
ls -lah
预期当前目录:
/home/username/linux_practice/final_review
notes.txt 为空文件,其余四项为目录。
B|编写脚本并生成日志
nano src/run.sh
在 Nano 中输入以下文件内容:
#!/bin/bash
echo "[INFO] LiDAR connected"
echo "[WARN] Scan frequency low"
echo "[ERROR] TF map to odom missing"
echo "[INFO] Mapping started"
echo "[error] Motor driver timeout"
按 Ctrl + O、Enter、Ctrl + X 保存退出。回到 Shell 后:
cat -n src/run.sh
chmod u+x src/run.sh
ls -l src/run.sh
./src/run.sh > logs/slam.log
cat -n logs/slam.log
./src/run.sh 执行脚本,> 将输出写入该练习项目的日志文件。再次执行同一命令会重写该日志。
预期日志:
1 [INFO] LiDAR connected
2 [WARN] Scan frequency low
3 [ERROR] TF map to odom missing
4 [INFO] Mapping started
5 [error] Motor driver timeout
C|创建、复制和重命名配置
echo "mode: practice" > config/slam.yaml
cat config/slam.yaml
cp -i config/slam.yaml backup/slam.yaml
mv -i backup/slam.yaml backup/slam_backup.yaml
ls -l config/slam.yaml backup/slam_backup.yaml
mode: practice 仅为示例文字,不是可直接应用于 SLAM Toolbox 的真实配置模板。
验证结果:原配置仍在,备份已改名,backup/slam.yaml 不再是当前备份的名称。
D|查找文件与排查模拟日志
find . -type f -name "*.yaml"
grep -in "error" logs/slam.log
grep -n "WARN" logs/slam.log
预期 YAML 路径(顺序可能不同):
./config/slam.yaml
./backup/slam_backup.yaml
预期错误匹配:
3:[ERROR] TF map to odom missing
5:[error] Motor driver timeout
继续:
less -N logs/slam.log
在阅读器中输入 /ERROR 并按 Enter,观察上下文,最后按 q 返回终端。不应在 less 界面中继续粘贴 Shell 命令。
E|练习删除确认与取消
touch delete_me.txt keep_me.txt
ls -l delete_me.txt keep_me.txt
rm -i delete_me.txt
确认询问指向 delete_me.txt 后,输入 y 并回车。随后:
rm -i keep_me.txt
这次输入 n 并回车。最后检查:
ls -l
应看到 keep_me.txt,不再看到 delete_me.txt。y 或 n 是在 rm 的询问处输入的回答,不是在普通 Shell 提示符下单独执行的命令。
F|创建并终止测试进程
在同一终端:
sleep 600 &
test_pid=$!
echo "$test_pid"
ps -p "$test_pid" -o pid,ppid,stat,args
确认是刚创建的 sleep 600 后:
kill "$test_pid"
ps -p "$test_pid" -o pid,ppid,stat,args
预期:发送 SIGTERM 前可查到该进程,之后通常查不到。若返回 No such process,可能是进程已自然结束,不应因此改用另一个 PID 来终止。
G|查询身份、软件和服务
whoami
sudo whoami
whoami
输出示例(取决于当前用户):
username
root
username
如需输入密码,应在终端中输入,不应写入文件。
查询软件包与目录树:
apt show tree
apt list --installed tree
tree -L 3 ~/linux_practice/final_review
查询日志服务:
systemctl status --no-pager systemd-journald.service
至此,20 个命令均已覆盖;无需为完成示例额外执行系统升级、卸载软件或停止服务。
5.2 完成标准
| 检查项 | 应达到的结果 |
|---|---|
| 路径 | 能说明当前目录与 src/run.sh 的相对位置 |
| 文件 | 配置原件与备份均存在 |
| 内容 | 日志包含 5 行模拟内容 |
| 权限 | 能解释脚本为何可用 ./src/run.sh 执行 |
| 搜索 | 能用一条命令找到第 3、5 行错误 |
| 阅读 | 能进入 less、搜索并退出 |
| 删除 | delete_me.txt 不存在,keep_me.txt 保留 |
| 进程 | 仅对本次创建的 sleep 发送信号 |
| 系统 | 能区分普通用户、root、软件包和服务状态 |
六、自测题与参考答案
本组题目不采用选择题形式,重点检验“能解释、会写命令”的能力。
6.1 自测题
| 编号 | 问题 |
|---|---|
| 1 | 当前位于 /home/username/ros2_ws/src,执行 cd .. 后在哪里?执行 cd ~ 又在哪里? |
| 2 | ls -l backup 与 ls -ld backup 有什么区别? |
| 3 | 文件 main.py 已有代码,再执行 touch main.py 会清空吗? |
| 4 | project_backup 原本不存在,怎样复制整个 project?如果目标已是目录,结果有什么不同? |
| 5 | 怎样把当前 data.txt 移动到已有 results 中,同时改名为 data_old.txt,并在覆盖前确认? |
| 6 | rm -i a.txt 的询问中输入 n 后,文件还在吗? |
| 7 | a.txt 是以换行符结尾的 Hello,执行 echo "Ubuntu" >> a.txt 后是什么内容?换成 > 呢? |
| 8 | 如何在 slam.log 中忽略大小写搜索 error,并显示行号? |
| 9 | 如何递归查找当前目录中所有 .yaml 普通文件?为什么模式要加引号? |
| 10 | 在 less 中,g、G、q 各表示什么?Nano 怎样保存退出? |
| 11 | 644 对应什么权限?chmod u+x 与 chmod 755 一定相同吗? |
| 12 | 为什么 whoami → sudo whoami → whoami 不会让最后一条也自动变成 root? |
| 13 | apt update 与 apt upgrade 的差别是什么? |
| 14 | 当前 Shell PID 与最近后台任务 PID 分别用什么表达式获取? |
| 15 | kill PID 与 kill -9 PID 的区别是什么? |
| 16 | systemctl start 与 systemctl enable 的区别是什么? |
6.2 参考答案
1. cd .. 进入 /home/username/ros2_ws;cd ~ 进入 /home/username。前者根据当前位置返回一级,后者返回主目录。
2. ls -l backup 默认列出目录内部可见内容;ls -ld backup 显示 backup 目录自身的信息。
3. 不会。默认更新访问时间与修改时间,保留已有内容;不存在时才创建空文件。
4.
cp -r project project_backup
目标不存在时创建备份目录;目标已存在且为目录时,通常产生 project_backup/project/,而不是自动替换整个目标目录。
5.
mv -i data.txt results/data_old.txt
6. 还在。n 表示不删除。-i 本身不代表“文件受到永久保护”。
7. 使用 >> 时保留 Hello,并在下一行追加 Ubuntu;使用 > 时通常只剩 Ubuntu。原内容是否以换行符结束,会影响追加后是否另起一行。
8.
grep -in "error" slam.log
9.
find . -type f -name "*.yaml"
引号使 Shell 不提前展开 *,从而把匹配模式交给 find 处理。
10. g 到开头,G 到末尾,q 退出;Nano 常用的保存退出流程是 Ctrl + O → Enter → Ctrl + X。
11. 644 对应 rw-r--r--,普通文件的完整类型和权限显示为 -rw-r--r--。chmod u+x 只增加所有者的 x,保留其他基本权限;chmod 755 明确设置三组权限,二者不一定相同。
12. 普通 sudo 命令 以目标身份运行该命令,不会把父 Shell 永久切换身份。常见默认配置中目标为 root。
13. update 获取软件包索引;upgrade 根据索引和依赖条件安装升级。
14. $$ 表示当前 Shell 的 PID;$! 表示最近放入后台的任务 PID。示例中使用:
test_pid=$!
15. 默认 kill 发送 SIGTERM,可被程序处理或忽略;kill -9 发送 SIGKILL,不能被程序捕获或忽略,程序没有机会通过自身退出处理清理状态。
16. start 立即启动;enable 建立相应启用关系,常用于随系统启动拉起,默认并不立即启动。两者解决的不是同一个问题。
七、学习方法与参考资料
7.1 按任务学习,不必按序号死记
| 学习主题 | 核心命令 | 应掌握的能力 |
|---|---|---|
| 文件组织 | pwd、ls、cd、mkdir、touch、cp、mv、rm | 创建目录、备份、改名、安全删除 |
| 文本处理 | cat、nano、echo、grep、find、less | 编辑脚本、写日志、查找配置、定位错误 |
| 权限与系统 | chmod、sudo、apt、ps、kill、systemctl | 运行脚本、安装软件、识别进程、理解服务 |
遇到实际任务时,可先用一句自然语言描述需求,再选择命令。例如:“查找所有 YAML 配置”对应 find;“在日志中查找错误内容”对应 grep;“观察报错前后的过程”适合 less。
7.2 本地帮助:忘记参数时如何查阅
以下是查阅方法,不计入本文档的 20 个主命令:
ls --help
grep --help
man chmod
help cd
help echo
man 用于查看手册;Bash 内建命令也可以使用 help。不同安装的软件版本、配置和语言环境可能使输出有所不同,应优先核对本机支持的选项。手册进入分页界面时通常可按 q 返回。参考:Bash 内建帮助
7.3 参考资料
正文已在相应说明旁标注来源。以下均为项目官方文档,或由 Ubuntu、Debian 发布的软件随附手册;本文档采用的是稳定基础功能,不要求本机版本号与网页标题一致。
| 范围 | 资料 |
|---|---|
| Shell 与路径 | Bash 手册;cd 等内建命令;echo 与内建帮助;特殊参数;重定向;路径解析 |
| 目录与文件 | pwd;ls;mkdir;touch;cp;mv;rm;cat |
| 编辑与检索 | Nano 快捷键;grep;find;less |
| 权限与元数据 | chmod;权限结构;GNU Coreutils 手册 |
| 身份与软件 | sudo;APT;tree |
| 进程与服务 | ps;kill;Linux 信号;systemctl |
操作路线
先确认位置和对象
↓
明确是查看、创建、修改、移动,还是删除
↓
选择命令并检查参数
↓
涉及覆盖、删除、权限、进程时,再核对影响范围
↓
执行后用输出或状态验证
掌握命令的标准,不是记住名称,而是能够说明:它处理谁、会改变什么,以及怎样确认结果。