ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux基础与工程工具实战:电控开发者的命令行入门指南

Linux基础与工程工具实战:电控开发者的命令行入门指南 大家好欢迎回到电控组竞培营系列教程。在之前的学习中我们已经接触过不少与电控开发相关的概念。但当你准备正式开始接触嵌入式 Linux、机器人操作系统ROS、复杂工程项目的编译部署或者想更高效地管理开发服务器时会发现一个绕不开的基础技能——Linux。很多同学在 Windows 环境下写代码、烧录单片机非常熟练但一打开 Linux 终端就感觉无从下手。这很正常因为 Linux 的学习路径和图形化操作习惯差异很大。本文作为竞培营第三讲将围绕“Linux 基础与工程工具”这个主题帮大家建立一个完整的知识框架。文章会从“为什么要学”讲起然后覆盖环境搭建、日常高频命令、用户与权限、文本处理、网络与工程协作工具最后给出常见报错的排查思路和实践建议。无论你未来是做嵌入式底层开发、机器人算法部署还是单纯想提升开发效率这篇文章都值得你花 20 分钟耐心看完并跟着操作一遍。1. 为什么电控方向要掌握 Linux很多刚接触电控的同学会有疑问我们平时用 Keil、STM32CubeMX 都是在 Windows 下完成的为什么还要单独学习 Linux1.1 嵌入式开发的必然选择现代电控开发早已不是只写一个裸机程序那么简单。当你开始接触以下场景时Linux 几乎是绕不开的使用 ROSRobot Operating System进行机器人开发时官方主推 Ubuntu 系统交叉编译 ARM 平台程序时大部分工具链都优先支持 Linux运行 SLAM、路径规划、视觉识别等算法库依赖大量 Linux 环境下的开源库嵌入式 Linux 驱动开发、内核裁剪、设备树修改需要在 Linux 主机上完成项目协同、代码版本管理、自动化构建脚本很多团队统一使用 Linux 服务器。即便是传统意义上的“电控”岗位现在也越来越强调与上位机、算法、操作系统的协同能力。1.2 效率思维的转变Linux 最核心的思维方式是“一切皆文件一切皆命令”。你可以用一个终端完成绝大多数工作编辑代码、编译工程、查看日志、远程连接服务器、批量处理文件。相比之下图形界面虽然直观但在自动化、批量化和远程操作场景下效率明显更低。学习 Linux 不只是学命令更是在建立一种“基于命令行的工作流”。这种工作流一旦熟练你后续接触 Docker、Git、CMake、交叉编译、CI/CD 等工程工具时会顺畅很多。1.3 工程团队的协作标准在实际工程项目中版本管理Git、问题追踪、持续集成等环节高度依赖 Linux 服务器环境。即使你负责的是单片机端代码也会涉及到在 Linux 服务器上拉取代码、执行自动化编译、查看构建日志等操作。提前掌握 Linux 基础相当于提前适应真实的工程协作环境。2. 环境准备与版本选择学习 Linux 首先要有一台可用的 Linux 环境。这里提供三种常见方案大家可以根据自己的电脑配置和项目需求选择。2.1 安装方式对比方案优点缺点适用场景虚拟机VMware / VirtualBox与 Windows 共存切换方便可随时快照回滚性能有一定损耗初学者推荐日常学习足够WSL2Windows Subsystem for Linux启动快集成度高可直接访问 Windows 文件不支持部分硬件直通和图形界面偏向开发调试、命令行工具链场景双系统物理安装性能最好硬件兼容性最强切换系统需重启有一定安装风险需要大量编译、性能调优、驱动开发2.2 发行版选择建议Linux 发行版非常多但对于初学者和电控方向开发推荐优先选择Ubuntu LTS长期支持版比如 20.04 LTS 或 22.04 LTS。原因很简单社区资料丰富遇到问题基本都能搜到解决方案ROS 等机器人框架对 Ubuntu 支持最好软硬件兼容性好驱动安装相对省心LTS 版本维护周期长适合长期学习使用。其他常见发行版比如 CentOS、Debian、Arch Linux 等各有特点但现阶段不建议大家花太多时间纠结。先把一个发行版用熟练后面再按需扩展。2.3 环境验证安装完成后打开终端执行以下命令确认系统信息uname -a lsb_release -a whoami预期输出效果类似Linux ubuntu 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy如果能看到类似的系统信息说明环境已经准备好。版本号不必完全一致根据你自己安装的版本为准即可。3. 高频 Linux 命令精讲这一部分是全文的重点。我会按照“文件管理、目录跳转、内容查看、权限控制、进程管理、网络工具”几个维度拆开讲每一条命令都会说明用途、常用参数和典型示例。3.1 文件和目录操作pwdpwd用于显示当前工作目录的绝对路径。这是你迷失在目录树中时最常用的自我定位命令。pwdlsls列出当前目录下的文件和子目录。常用组合参数ls # 平铺列出文件名 ls -l # 详细信息包括权限、属主、大小、修改时间 ls -a # 显示全部文件包括以 . 开头的隐藏文件 ls -la # 平时最常用查看详细列表 ls -lh # 以人类可读的方式显示文件大小K、M、G示例输出total 48 drwxr-xr-x 6 ubuntu ubuntu 4096 Dec 2 10:30 . drwxr-xr-x 3 root root 4096 Dec 2 10:18 .. -rw-rw-r-- 1 ubuntu ubuntu 220 Dec 2 10:28 main.py drwxrwxr-x 2 ubuntu ubuntu 4096 Dec 2 10:28 scripts可以看到第一列是文件类型和权限位。d开头表示目录-开头表示普通文件。后面每三个字符一组分别代表属主、属组、其他用户的读r、写w、执行x权限。cdcd用于切换目录。这是使用频率最高的命令之一。cd /home/ubuntu # 切换到绝对路径 cd .. # 返回上一级目录 cd ~ # 切换到当前用户的家目录 cd - # 切换到上一次所在目录 cd / # 切换到根目录mkdirmkdir创建目录。常用参数mkdir project # 创建单级目录 mkdir -p a/b/c # 递归创建多级目录不会因父目录不存在而报错 mkdir -p project/{src,include,build}最后这条命令会一次性创建project/src、project/include、project/build三个目录适合初始化工程结构。touchtouch有两个作用创建空文件或者修改已有文件的时间戳。touch README.md touch -d 2024-01-01 10:00 main.crmrm删除文件或目录。注意Linux 下删除文件不会经过回收站一旦删除很难恢复。rm test.c # 删除文件 rm -r build/ # 递归删除目录 rm -f temp.log # 强制删除不询问 rm -rf build/ # 递归强制删除谨慎使用rm -rf是运维人员口中“删库跑路”的代名词执行前务必确认路径是否正确。cpcp复制文件或目录。cp main.c main_backup.c # 复制文件 cp -r ./config ./config_backup # 递归复制整个目录 cp -i main.c new.c # 覆盖前提示确认mvmv移动文件也可以用来重命名。mv old_name.c new_name.c # 重命名 mv file.txt /home/ubuntu/docs/ # 移动到其他目录 mv ~/Downloads/installer.run /opt/ # 移动并覆盖3.2 文件内容查看与搜索catcat直接输出整个文件内容适合查看小文件。cat /etc/os-release cat -n main.py # 显示行号less / more当文件内容过长一屏放不下时用less可以分页查看。支持上下翻页、搜索等操作。less /var/log/syslog进入less后按空格键向下翻页按b向上翻页输入/关键词向下搜索按q退出。这个命令在排查日志文件时非常实用。head / tail只看头部或尾部若干行。head -20 main.py # 查看前 20 行 tail -50 app.log # 查看最后 50 行 tail -f app.log # 实时跟踪日志输出调试程序时非常常用tail -f是查看运行时日志的利器。比如你在服务器上部署了一个服务想实时观察打印输出直接用这个命令就能持续刷新。grepgrep在文件内容中搜索符合条件的行是日志排查、代码检索的核心工具。grep ERROR app.log # 在文件中查找包含 ERROR 的行 grep -r TODO ./src/ # 在整个目录中递归搜索 grep -n int main main.c # 显示匹配行并带行号 grep -v #include main.c # 反向匹配输出不包含 #include 的行 grep -i error app.log # 忽略大小写这里重点推荐grep -r的组合用法当你接手一个陌生工程时通过关键字快速定位相关代码位置效率极高。3.3 用户与权限管理Linux 是多用户操作系统每个文件都有属主和权限控制。团队协作开发时经常需要创建用户、分配权限。whoami / idwhoami # 查看当前登录用户名 id # 查看当前用户的 uid、gid 和所属组sudosudo让普通用户以 root 权限执行命令。注意不是所有用户都能执行sudo需要该用户在sudo组中。sudo apt updateuseradd / adduseruseradd是底层命令adduser是更友好的交互式命令推荐新手使用后者。sudo adduser newuser执行后系统会引导你设置密码、填写用户信息。当需要给开发机或服务器新建一个账户时这条命令很常用。passwd修改密码。passwd # 修改当前用户密码 sudo passwd root # 修改 root 用户密码chmodchmod修改文件权限。权限表示法有两种符号法和数字法。数字法中r4、w2、x1。chmod 755 script.sh # 属主可读写执行属组和其他用户可读执行 chmod x run.sh # 给所有用户增加执行权限 chmod -R 755 ./build/ # 递归修改目录下所有文件一个常见的实际场景你写了一个脚本run.sh但执行./run.sh时提示Permission denied。这时只需要执行chmod x run.sh即可解决。chownchown修改文件属主和属组。sudo chown ubuntu:ubuntu main.py # 将文件属主修改为 ubuntu属组也修改为 ubuntu sudo chown -R ubuntu:ubuntu ./project # 递归修改整个目录3.4 进程与系统管理psps查看进程状态。ps -ef # 查看所有进程的完整信息 ps aux # 查看所有进程包含 CPU 和内存占用 ps -ef | grep python # 过滤出与 python 相关的进程top / htoptop实时显示系统资源占用和进程列表类似 Windows 的任务管理器。htop是更友好的增强版界面彩色支持鼠标操作但需要额外安装。top sudo apt install htop htop在top界面中按q退出按M按内存排序按P按 CPU 排序。killkill向进程发送信号常用于终止异常进程。kill PID # 正常终止进程 kill -9 PID # 强制杀死进程慎用 pkill -f python # 通过进程名匹配并终止注意如果进程有未保存的数据kill -9可能造成数据丢失。能先尝试普通kill就尽量不要直接上-9。df / du磁盘空间查看。df -h # 查看磁盘分区使用情况人类可读 du -sh ./build/ # 查看某个目录的总大小 du -sh * # 查看当前目录下所有子目录和文件的大小当你编译大工程时发现磁盘爆满或者需要确认哪个目录占空间最多时这两个命令非常实用。systemctl管理系统服务。这是现代 Linux 系统中服务管理的标准方式。sudo systemctl status ssh # 查看 ssh 服务状态 sudo systemctl start ssh # 启动 ssh 服务 sudo systemctl enable ssh # 设置开机自启 sudo systemctl restart network # 重启网络服务3.5 网络工具ping测试网络连通性。ping -c 4 baidu.com # 发送 4 个 ICMP 包后停止ifconfig / ip addr查看网络接口信息比如 IP 地址、MAC 地址。ifconfig ip addr showssh远程登录到 Linux 服务器。这是工程协作中最常用的命令之一。ssh ubuntu192.168.1.100 ssh -p 2222 ubuntu192.168.1.100 # 指定端口第一次连接时会提示确认主机指纹输入yes即可。之后输入密码登录。scp基于 SSH 协议远程复制文件常用于上传代码到服务器、下载日志到本地。scp main.py ubuntu192.168.1.100:/home/ubuntu/ scp -r ./build ubuntu192.168.1.100:/home/ubuntu/ scp ubuntu192.168.1.100:/var/log/app.log ./wget / curl下载文件或测试接口。wget https://example.com/file.tar.gz curl -I https://www.baidu.com # 发起 HEAD 请求查看响应头4. 工程工具与工作流单纯记住命令还不够真正的效率提升来自于将命令组合成工作流。这一节我们重点讲电控开发中最常用的工程工具。4.1 Vim 编辑器基础在 Linux 服务器上如果没有图形界面或者你想快速修改一个配置文件就必须掌握一种终端编辑器。Vim 是 Linux 系统内置的经典编辑器必须会基本操作。Vim 有三种模式普通模式Normal默认模式用于移动光标、删除、复制插入模式Insert用于输入文字按i进入命令行模式Command用于保存、退出、搜索按:进入。最常用的操作只记五条就够vim main.py # 打开文件 i # 进入插入模式开始编辑 Esc # 回到普通模式 :wq # 保存并退出 :q! # 不保存强制退出进入插入模式后按Esc返回普通模式然后输入:wq回车即可保存退出。使用 Vim 时最常犯的错误是忘记切换模式导致输入内容变成命令。多练几次就习惯了。4.2 Git 版本管理Git 是工程开发中不可缺少的工具。配置好 Git 后任何代码改动都有记录可以随时回退到历史版本。# 配置用户信息首次使用必须配置 git config --global user.name Your Name git config --global user.email your_emailexample.com # 初始化仓库 git init # 添加文件到暂存区 git add main.c git add . # 提交到本地仓库 git commit -m feat: add main logic # 查看状态和日志 git status git log --oneline # 关联远程仓库并推送 git remote add origin gitgithub.com:user/repo.git git push -u origin main建议每位同学都注册一个 GitHub 或 Gitee 账号把平时的练习代码托管上去既保证代码安全也能记录自己的成长轨迹。4.3 编译工具链与 Make在 Linux 下编译 C/C 工程最基础的工具是gcc和make。很多时候我们并不需要手动输入超长的编译命令而是通过 Makefile 来组织编译规则。先看一个最简单的例子。创建一个hello.c#include stdio.h int main() { printf(Hello, Linux!\n); return 0; }直接编译运行gcc hello.c -o hello ./hello当工程文件增多后可以写一个简单的 MakefileCC gcc TARGET app OBJS main.o utils.o $(TARGET): $(OBJS) $(CC) -o $(TARGET) $(OBJS) main.o: main.c $(CC) -c main.c utils.o: utils.c $(CC) -c utils.c clean: rm -f $(TARGET) $(OBJS)然后在终端执行make # 编译 make clean # 清理对于嵌入式交叉编译只需要把CC换成对应的交叉编译器前缀比如arm-linux-gnueabihf-gcc。4.4 通过 SSH 远程开发真实的工程开发中代码通常放在远程服务器上本地电脑通过 SSH 连接进行操作。这个过程会用到 SSH 密钥免密登录# 本地生成密钥对 ssh-keygen -t rsa -b 4096 -C your_emailexample.com # 将公钥拷贝到服务器 ssh-copy-id ubuntu192.168.1.100配置完成后再次ssh ubuntu192.168.1.100就不需要输入密码了。远程开发时可以配合 VS Code 的 Remote-SSH 插件把本地编辑器直接连接到服务器上编码体验和本地开发几乎一致。5. 常见问题排查与避坑指南以下这些问题是竞培营学员初学 Linux 时最容易踩的坑提前了解能省下大量排查时间。问题现象常见原因解决思路Permission denied文件没有执行权限或当前用户权限不足检查文件权限执行chmod x高权限操作前加sudocommand not found命令不存在或不在 PATH 环境变量中确认软件是否安装检查 PATH 配置多使用绝对路径No space left on device磁盘空间已满使用df -h查看分区使用情况删除不需要的临时文件SSH 连接超时防火墙拦截或服务未启动确认ssh服务状态检查端口是否开放虚拟机无法联网网络适配器模式配置错误虚拟机网络模式改为 NAT 或桥接模式重启网络服务wget卡住或下载失败网络原因或源地址不可达更换下载源使用国内镜像站加速文件删除后找不到Linux 删除文件不经过回收站定期备份重要数据删除前用ls确认目标grep搜不到结果日志文件路径不对或权限不足使用ls -la确认路径必要时加sudo查看日志5.1 网络源问题国内用户使用 Ubuntu 时默认软件源是国外服务器下载速度往往很慢。建议将软件源更换为国内镜像源比如清华源、阿里云源。具体操作方式是在/etc/apt/sources.list文件中替换镜像地址然后执行sudo apt update这里不过多展开搜索“Ubuntu 更换国内源”就能找到对应版本的教程。5.2 路径问题Linux 路径通过/分隔不像 Windows 用\。初学者常犯的错误是使用\作为路径分隔符在文件路径中带了空格而没有使用引号或转义。推荐做法是所有目录和文件名尽量使用小写字母、数字、下划线避免空格和特殊字符。6. 最佳实践与工程建议命令行用得越多越能体会到规范和习惯的重要性。下面给出几条能直接提升开发效率的建议。6.1 使用 Tab 补全和方向键历史任何命令、路径输入到一半时按Tab键自动补全。如果有多项匹配连续按两次Tab会列出所有候选。按上下方向键可以快速调出历史命令。配合history命令可以查看过往执行的所有命令。history history | grep ssh这能显著减少输入的出错率和重复劳动。6.2 善用命令组合Linux 的哲学是一条命令只做一件事然后用管道把它们组合起来。以下几个组合几乎每天都会用到# 实时查看日志中 ERROR 关键字 tail -f app.log | grep ERROR # 查看当前目录最大的 5 个文件 du -ah . | sort -rh | head -5 # 统计代码行数 find . -name *.c | xargs wc -l6.3 安全边界意识在 Linux 下操作时要始终保持安全意识sudo只用于必要的管理操作避免长时间以 root 身份操作不要随意修改系统目录下的文件属性删除命令执行前仔细确认路径重要的工程目录应该纳入 Git 版本管理避免不可逆的数据丢失生产环境或共享服务器上所有变更操作前先备份。6.4 环境隔离如果你需要在同一台机器上使用不同版本的 Python、Node.js 或工具链建议使用虚拟环境或容器方案。比如 Python 的venv、conda以及近年来团队协作中非常流行的 Docker。这些工具能有效隔离依赖避免版本冲突提升开发体验。6.5 建立自己的速查手册不要试图一次记住所有命令。更高效的做法是遇到一个不会的操作就搜索一次并把常用命令记录到自己的笔记或仓库中形成一份个人速查手册。经过一段时间积累它比网上任何教程都更适合你。7. 总结与后续学习建议这一讲我们从“为什么要学 Linux”出发完成了 Ubuntu 环境的准备系统梳理了文件管理、目录跳转、内容查看、权限控制、进程管理、网络工具等高频命令同时引入了 Vim、Git、Make 和 SSH 这几个工程开发必备工具最后整理了初学者最常见的问题清单和实践建议。掌握这些内容之后你可以做到在 Linux 环境下独立完成日常文件操作和程序编译通过 SSH 远程连接开发服务器使用 Git 管理自己的代码版本看懂并编写简单的 Makefile遇到权限、路径、网络等问题时能够自主排查。下一步的学习路线建议分两条线并行推进命令深化练习 shell 脚本编写理解环境变量、管道、重定向等核心机制工程实战在 Ubuntu 上安装并运行 ROS、编译一个开源 C 项目、使用 Docker 部署一个简单服务。Linux 的学习是一个反复练习的过程。刚开始敲命令会觉得很慢但只要坚持用命令行替代鼠标操作一两周之后就能明显感受到效率提升。建议把今天讲到的命令在终端中亲手敲一遍遇到问题不要怕多搜索、多思考、多记录。如果你在练习过程中碰到了某些奇怪报错可以优先检查路径、权限和软件源这三个最常出问题的地方——大部分坑都能在排查完这三项之后解决。如果这篇文章对你有帮助可以收藏备用也欢迎在评论区交流你在学习 Linux 过程中遇到的问题。下一讲我们会进一步深入到嵌入式交叉编译与开发工具链实战我们到时候见。
返回列表