技术

Ubuntu Linux 20 个常用命令参考手册

面向 Linux 初学者的命令参考,按“基础概念 → 命令详解 → 易混辨析 → 综合示例 → 自测”的顺序组织。

项目说明
适用系统Ubuntu、Debian 等基于 APT 的 Linux 发行版
ShellBash
涵盖范围20 个常用命令
更新日期2026-10-29

目录

部分内容
一20 个命令总览
二终端、路径、参数与符号基础
三20 个命令详解
四易混知识与常见报错
五综合示例:用 20 个命令完成一个项目
六自测题与参考答案
七学习方法与参考资料

一、20 个命令总览

下表用于速查。示例中的文件、目录、PID 和服务均为占位符,实际使用时必须替换为系统中真实存在的对象,不能把示例编号当作本机的实际对象。

序号命令功能概要代表用法
1pwd显示当前工作目录pwd
2ls列出目录内容ls -lah
3cd切换工作目录cd ~/linux_practice
4mkdir创建目录mkdir -p python/day01
5touch新建空文件,或更新文件时间戳touch main.py
6cp复制,保留源文件cp -i a.txt b.txt
7mv移动或重命名mv -i a.txt backup/
8rm删除指定文件rm -i test.txt
9cat输出、拼接文本内容cat -n notes.txt
10nano在终端编辑文本nano notes.txt
11echo输出文字或变量的值echo "$HOME"
12grep在内容中查找匹配行grep -in "error" slam.log
13find按条件查找文件或目录find . -type f -name "*.yaml"
14less分页阅读和搜索文本less -N slam.log
15chmod修改文件权限chmod u+x hello.sh
16sudo经授权,以其他用户身份执行命令sudo whoami
17apt搜索、安装、更新、卸载软件包apt show tree
18ps查看进程快照ps -p 1234
19kill向进程发送信号kill 1234
20systemctl查询和管理 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

出现询问时:

输入含义结果
yYes确认删除
nNo不删除该文件

-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
数字权限用于普通文件时的含义
755rwxr-xr-x所有者读写执行,组和其他用户读执行
644rw-r--r--所有者读写,组和其他用户只读
600rw-------只有所有者具备读写权限
777rwxrwxrwx三类用户都有读写执行权限

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 ~ 又在哪里?
2ls -l backup 与 ls -ld backup 有什么区别?
3文件 main.py 已有代码,再执行 touch main.py 会清空吗?
4project_backup 原本不存在,怎样复制整个 project?如果目标已是目录,结果有什么不同?
5怎样把当前 data.txt 移动到已有 results 中,同时改名为 data_old.txt,并在覆盖前确认?
6rm -i a.txt 的询问中输入 n 后,文件还在吗?
7a.txt 是以换行符结尾的 Hello,执行 echo "Ubuntu" >> a.txt 后是什么内容?换成 > 呢?
8如何在 slam.log 中忽略大小写搜索 error,并显示行号?
9如何递归查找当前目录中所有 .yaml 普通文件?为什么模式要加引号?
10在 less 中,g、G、q 各表示什么?Nano 怎样保存退出?
11644 对应什么权限?chmod u+x 与 chmod 755 一定相同吗?
12为什么 whoami → sudo whoami → whoami 不会让最后一条也自动变成 root?
13apt update 与 apt upgrade 的差别是什么?
14当前 Shell PID 与最近后台任务 PID 分别用什么表达式获取?
15kill PID 与 kill -9 PID 的区别是什么?
16systemctl 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

操作路线

先确认位置和对象
        ↓
明确是查看、创建、修改、移动,还是删除
        ↓
选择命令并检查参数
        ↓
涉及覆盖、删除、权限、进程时,再核对影响范围
        ↓
执行后用输出或状态验证

掌握命令的标准,不是记住名称,而是能够说明:它处理谁、会改变什么,以及怎样确认结果。

发表评论