2. Linux 核心基础:文件系统与目录结构、常用命令、Vim 编辑器、Shell 脚本基础
做机器人开发,Linux 是绕不过去的坎。我见过不少新手,拿到一块树莓派或 Jetson,第一件事就是装桌面环境,然后全程鼠标操作。嗯,这其实是在给自己挖坑。你想想看,机器人系统里,你连个显示器都不一定有,全靠 SSH 连进去,不会命令行,寸步难行。
这一章,我把最核心的 Linux 技能给你捋一遍。不是那种「背命令大全」的讲法,而是告诉你:哪些是机器人开发中真正高频的,哪些坑我替你踩过了。
2.1 文件系统与目录结构
Linux 的文件系统,说白了就是一棵倒挂的树。根是 /,所有东西都从它长出来。这和 Windows 的 C 盘、D 盘思路完全不同。
我刚开始接触 Linux 时,最不习惯的就是没有盘符。后来才明白,这种设计让一切设备、文件、进程都统一成了文件,非常优雅。
机器人开发中你必须记住的目录:
/home— 用户的家目录。你的代码、配置文件,基本都放这儿。/etc— 系统配置文件。比如网络配置、ROS 的环境变量,都在这里。/var— 可变数据。日志文件、数据库,跑机器人时经常要查。/dev— 设备文件。你的激光雷达、摄像头、串口,都映射成这里的文件。/proc— 进程信息。实时查看系统状态,调试时很有用。/opt— 第三方软件。我习惯把 ROS 和一些 SDK 装在这里。
这里有个关键点:/dev 目录下的设备文件,是机器人硬件交互的入口。比如 /dev/ttyUSB0 通常是 USB 转串口,你的下位机或者舵机控制板,往往就挂在这个节点上。
我曾经犯过的错: 有一次调试激光雷达,怎么都读不到数据。折腾了半天,才发现是 /dev/ttyUSB0 的权限不对。Linux 默认只有 root 能访问,普通用户需要加 dialout 组。所以,拿到新设备,第一件事就是 sudo usermod -a -G dialout $USER,然后注销重登。
2.2 高频命令:ls, cd, grep, find, chmod
命令不在多,够用就行。我整理了一套「机器人开发五件套」,覆盖了日常 80% 的操作场景。
ls — 查看目录内容
这个命令太基础了,但参数有讲究。我个人习惯用 ls -lh,显示文件大小和权限,一目了然。如果你要看隐藏文件(比如 .bashrc),加个 -a。
# 常用组合
ls -lh # 人性化显示文件大小
ls -la # 显示所有文件(包括隐藏文件)
ls -ltr # 按时间倒序排列,最新文件在最后
cd — 切换目录
没什么好说的,但有几个技巧:
cd -回到上一个目录,来回切换时非常方便。cd ~直接回 home。cd ../../回退两级,我经常用。
grep — 文本搜索
这个命令,是调试时的救命稻草。机器人跑起来后,日志文件动辄几百兆,你不可能一行行翻。用 grep 过滤关键词,瞬间定位问题。
# 在 ros.log 中查找 error 相关行,忽略大小写
grep -i "error" /var/log/ros.log
# 递归搜索当前目录下所有 .cpp 文件中的 "imu" 关键词
grep -rn "imu" --include="*.cpp" ./
我的习惯: 每次启动机器人节点,我都会把输出重定向到文件,然后用 tail -f 配合 grep 实时过滤。比如:roslaunch my_robot start.launch | grep -i "error"。这样终端只显示错误信息,清爽多了。
find — 文件查找
有时候你明明记得有个配置文件,但就是找不到。用 find 吧。
# 在 /etc 下找所有以 .conf 结尾的文件
find /etc -name "*.conf"
# 找最近 1 小时内修改过的文件(调试时很有用)
find ./ -mmin -60
chmod — 修改权限
机器人开发中,经常要给脚本加执行权限。比如你写了一个 Python 启动脚本:
chmod +x start_robot.py
# 然后就可以直接 ./start_robot.py 运行了
权限的数字表示法也要懂:chmod 755 表示所有者可读写执行,其他人可读可执行。我一般给脚本用 755,给配置文件用 644。
我曾经踩过的坑: 有一次把整个 /home 目录递归执行了 chmod 777,结果系统安全策略报警,SSH 都连不上了。记住,777 是给所有人所有权限,非常危险。不到万不得已,别用。
2.3 Vim 编辑器
说到 Vim,很多人第一反应是「怎么退出?」。嗯,我理解。但等你习惯了,你会发现它比任何图形化编辑器都高效。尤其是在远程 SSH 进机器人时,没有 GUI,Vim 就是你的救命稻草。
我不打算讲 Vim 的所有功能,只讲你第一天就必须掌握的 10 个操作:
| 操作 | 按键 | 说明 |
|---|---|---|
| 进入编辑模式 | i |
光标处插入 |
| 退出编辑模式 | Esc |
回到普通模式 |
| 保存 | :w |
写入文件 |
| 退出 | :q |
未修改时直接退出 |
| 强制退出不保存 | :q! |
放弃修改 |
| 保存并退出 | :wq |
最常用 |
| 撤销 | u |
撤销上一步操作 |
| 复制当前行 | yy |
光标所在行 |
| 粘贴 | p |
在光标后粘贴 |
| 搜索 | /关键词 |
按 n 跳到下一个 |
刚开始用 Vim,你可能会觉得别扭。我的建议是:别贪多,先把这 10 个操作练熟。一周后,你就能感受到「手不离键盘」的快感了。
一个小技巧: 在 Vim 里,你可以用 :set number 显示行号。调试代码时,报错说第 42 行有问题,你一眼就能找到。如果想让 Vim 默认显示行号,在 ~/.vimrc 里加一行 set number 就行。
2.4 Shell 脚本基础
机器人开发中,你经常需要一键启动多个节点、设置环境变量、或者定时执行某个任务。手动敲命令太累了,写个脚本吧。
Shell 脚本,说白了就是把一堆命令按顺序写进一个文件,然后一次性执行。我给大家看一个真实的例子:
#!/bin/bash
# 文件名: start_robot.sh
# 功能:一键启动机器人核心节点
echo "=== 正在设置 ROS 环境 ==="
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash
echo "=== 启动激光雷达驱动 ==="
roslaunch rplidar_ros rplidar.launch &
sleep 2
echo "=== 启动里程计节点 ==="
rosrun my_robot odometry_node &
sleep 1
echo "=== 启动导航栈 ==="
roslaunch my_robot navigation.launch
echo "=== 所有节点已启动 ==="
这个脚本做了几件事:
- Shebang — 第一行
#!/bin/bash告诉系统用哪个解释器。 - 变量与注释 —
echo打印提示信息,#是注释。 - 后台运行 —
&把进程放到后台,这样不会阻塞后续命令。 - 延时 —
sleep 2等待节点启动完成,避免依赖冲突。
写完之后,别忘了加执行权限:
chmod +x start_robot.sh
./start_robot.sh
Shell 脚本的避坑指南
- 路径用路径或相对路径,别用 ~ — 在脚本里
~有时不生效,我习惯用$HOME。 - 检查命令是否执行成功 — 用
$?获取上一条命令的返回值,0 表示成功。 - 别忘记 source — 设置环境变量时,用
source而不是直接执行,否则变量只在子进程生效。
核心要点总结:
- Linux 文件系统是树形结构,
/dev是硬件交互入口。 - 高频命令:ls、cd、grep、find、chmod,练到肌肉记忆。
- Vim 先掌握 10 个基本操作,别贪多。
- Shell 脚本是自动化利器,写的时候注意路径和权限。
嗯,这一章的内容就到这里。这些技能不是看会的,是用会的。我建议你打开终端,把每个命令都敲一遍。遇到问题别怕,Linux 的报错信息其实很友好,仔细读一读,大部分问题都能自己解决。