当前位置: 首页 > news >正文

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

大家好,欢迎回到电控组竞培营系列教程。

在之前的学习中,我们已经接触过不少与电控开发相关的概念。但当你准备正式开始接触嵌入式 Linux、机器人操作系统(ROS)、复杂工程项目的编译部署,或者想更高效地管理开发服务器时,会发现一个绕不开的基础技能——Linux。

很多同学在 Windows 环境下写代码、烧录单片机非常熟练,但一打开 Linux 终端就感觉无从下手。这很正常,因为 Linux 的学习路径和图形化操作习惯差异很大。本文作为竞培营第三讲,将围绕“Linux 基础与工程工具”这个主题,帮大家建立一个完整的知识框架。文章会从“为什么要学”讲起,然后覆盖环境搭建、日常高频命令、用户与权限、文本处理、网络与工程协作工具,最后给出常见报错的排查思路和实践建议。

无论你未来是做嵌入式底层开发、机器人算法部署,还是单纯想提升开发效率,这篇文章都值得你花 20 分钟耐心看完,并跟着操作一遍。

1. 为什么电控方向要掌握 Linux

很多刚接触电控的同学会有疑问:我们平时用 Keil、STM32CubeMX 都是在 Windows 下完成的,为什么还要单独学习 Linux?

1.1 嵌入式开发的必然选择

现代电控开发早已不是只写一个裸机程序那么简单。当你开始接触以下场景时,Linux 几乎是绕不开的:

  • 使用 ROS(Robot 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 共存,切换方便,可随时快照回滚性能有一定损耗初学者推荐,日常学习足够
WSL2(Windows 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 文件和目录操作

pwd

pwd用于显示当前工作目录的绝对路径。这是你迷失在目录树中时最常用的自我定位命令。

pwd
ls

ls列出当前目录下的文件和子目录。常用组合参数:

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)权限。

cd

cd用于切换目录。这是使用频率最高的命令之一。

cd /home/ubuntu # 切换到绝对路径 cd .. # 返回上一级目录 cd ~ # 切换到当前用户的家目录 cd - # 切换到上一次所在目录 cd / # 切换到根目录
mkdir

mkdir创建目录。常用参数:

mkdir project # 创建单级目录 mkdir -p a/b/c # 递归创建多级目录,不会因父目录不存在而报错 mkdir -p project/{src,include,build}

最后这条命令会一次性创建project/srcproject/includeproject/build三个目录,适合初始化工程结构。

touch

touch有两个作用:创建空文件,或者修改已有文件的时间戳。

touch README.md touch -d "2024-01-01 10:00" main.c
rm

rm删除文件或目录。注意:Linux 下删除文件不会经过回收站,一旦删除很难恢复

rm test.c # 删除文件 rm -r build/ # 递归删除目录 rm -f temp.log # 强制删除,不询问 rm -rf build/ # 递归强制删除,谨慎使用

rm -rf是运维人员口中“删库跑路”的代名词,执行前务必确认路径是否正确。

cp

cp复制文件或目录。

cp main.c main_backup.c # 复制文件 cp -r ./config ./config_backup # 递归复制整个目录 cp -i main.c new.c # 覆盖前提示确认
mv

mv移动文件,也可以用来重命名。

mv old_name.c new_name.c # 重命名 mv file.txt /home/ubuntu/docs/ # 移动到其他目录 mv ~/Downloads/installer.run /opt/ # 移动并覆盖

3.2 文件内容查看与搜索

cat

cat直接输出整个文件内容,适合查看小文件。

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是查看运行时日志的利器。比如你在服务器上部署了一个服务,想实时观察打印输出,直接用这个命令就能持续刷新。

grep

grep在文件内容中搜索符合条件的行,是日志排查、代码检索的核心工具。

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 / id
whoami # 查看当前登录用户名 id # 查看当前用户的 uid、gid 和所属组
sudo

sudo让普通用户以 root 权限执行命令。注意,不是所有用户都能执行sudo,需要该用户在sudo组中。

sudo apt update
useradd / adduser

useradd是底层命令,adduser是更友好的交互式命令,推荐新手使用后者。

sudo adduser newuser

执行后系统会引导你设置密码、填写用户信息。当需要给开发机或服务器新建一个账户时,这条命令很常用。

passwd

修改密码。

passwd # 修改当前用户密码 sudo passwd root # 修改 root 用户密码
chmod

chmod修改文件权限。权限表示法有两种:符号法和数字法。数字法中r=4w=2x=1

chmod 755 script.sh # 属主可读写执行,属组和其他用户可读执行 chmod +x run.sh # 给所有用户增加执行权限 chmod -R 755 ./build/ # 递归修改目录下所有文件

一个常见的实际场景:你写了一个脚本run.sh,但执行./run.sh时提示Permission denied。这时只需要执行chmod +x run.sh即可解决。

chown

chown修改文件属主和属组。

sudo chown ubuntu:ubuntu main.py # 将文件属主修改为 ubuntu,属组也修改为 ubuntu sudo chown -R ubuntu:ubuntu ./project # 递归修改整个目录

3.4 进程与系统管理

ps

ps查看进程状态。

ps -ef # 查看所有进程的完整信息 ps aux # 查看所有进程,包含 CPU 和内存占用 ps -ef | grep python # 过滤出与 python 相关的进程
top / htop

top实时显示系统资源占用和进程列表,类似 Windows 的任务管理器。htop是更友好的增强版,界面彩色,支持鼠标操作,但需要额外安装。

top sudo apt install htop htop

top界面中,按q退出,按M按内存排序,按P按 CPU 排序。

kill

kill向进程发送信号,常用于终止异常进程。

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 show
ssh

远程登录到 Linux 服务器。这是工程协作中最常用的命令之一。

ssh ubuntu@192.168.1.100 ssh -p 2222 ubuntu@192.168.1.100 # 指定端口

第一次连接时会提示确认主机指纹,输入yes即可。之后输入密码登录。

scp

基于 SSH 协议远程复制文件,常用于上传代码到服务器、下载日志到本地。

scp main.py ubuntu@192.168.1.100:/home/ubuntu/ scp -r ./build ubuntu@192.168.1.100:/home/ubuntu/ scp ubuntu@192.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_email@example.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 git@github.com:user/repo.git git push -u origin main

建议每位同学都注册一个 GitHub 或 Gitee 账号,把平时的练习代码托管上去,既保证代码安全,也能记录自己的成长轨迹。

4.3 编译工具链与 Make

在 Linux 下编译 C/C++ 工程,最基础的工具是gccmake。很多时候我们并不需要手动输入超长的编译命令,而是通过 Makefile 来组织编译规则。

先看一个最简单的例子。创建一个hello.c

#include <stdio.h> int main() { printf("Hello, Linux!\n"); return 0; }

直接编译运行:

gcc hello.c -o hello ./hello

当工程文件增多后,可以写一个简单的 Makefile:

CC = 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_email@example.com" # 将公钥拷贝到服务器 ssh-copy-id ubuntu@192.168.1.100

配置完成后,再次ssh ubuntu@192.168.1.100就不需要输入密码了。远程开发时,可以配合 VS Code 的 Remote-SSH 插件,把本地编辑器直接连接到服务器上,编码体验和本地开发几乎一致。

5. 常见问题排查与避坑指南

以下这些问题是竞培营学员初学 Linux 时最容易踩的坑,提前了解能省下大量排查时间。

问题现象常见原因解决思路
Permission denied文件没有执行权限或当前用户权限不足检查文件权限,执行chmod +x;高权限操作前加sudo
command 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 -l

6.3 安全边界意识

在 Linux 下操作时,要始终保持安全意识:

  • sudo只用于必要的管理操作,避免长时间以 root 身份操作;
  • 不要随意修改系统目录下的文件属性;
  • 删除命令执行前,仔细确认路径;
  • 重要的工程目录应该纳入 Git 版本管理,避免不可逆的数据丢失;
  • 生产环境或共享服务器上,所有变更操作前先备份。

6.4 环境隔离

如果你需要在同一台机器上使用不同版本的 Python、Node.js 或工具链,建议使用虚拟环境或容器方案。比如 Python 的venvconda,以及近年来团队协作中非常流行的 Docker。这些工具能有效隔离依赖,避免版本冲突,提升开发体验。

6.5 建立自己的速查手册

不要试图一次记住所有命令。更高效的做法是:遇到一个不会的操作就搜索一次,并把常用命令记录到自己的笔记或仓库中,形成一份个人速查手册。经过一段时间积累,它比网上任何教程都更适合你。

7. 总结与后续学习建议

这一讲我们从“为什么要学 Linux”出发,完成了 Ubuntu 环境的准备,系统梳理了文件管理、目录跳转、内容查看、权限控制、进程管理、网络工具等高频命令,同时引入了 Vim、Git、Make 和 SSH 这几个工程开发必备工具,最后整理了初学者最常见的问题清单和实践建议。

掌握这些内容之后,你可以做到:

  • 在 Linux 环境下独立完成日常文件操作和程序编译;
  • 通过 SSH 远程连接开发服务器;
  • 使用 Git 管理自己的代码版本;
  • 看懂并编写简单的 Makefile;
  • 遇到权限、路径、网络等问题时,能够自主排查。

下一步的学习路线,建议分两条线并行推进:

  1. 命令深化:练习 shell 脚本编写,理解环境变量、管道、重定向等核心机制;
  2. 工程实战:在 Ubuntu 上安装并运行 ROS、编译一个开源 C++ 项目、使用 Docker 部署一个简单服务。

Linux 的学习是一个反复练习的过程。刚开始敲命令会觉得很慢,但只要坚持用命令行替代鼠标操作,一两周之后就能明显感受到效率提升。建议把今天讲到的命令在终端中亲手敲一遍,遇到问题不要怕,多搜索、多思考、多记录。如果你在练习过程中碰到了某些奇怪报错,可以优先检查路径、权限和软件源这三个最常出问题的地方——大部分坑都能在排查完这三项之后解决。

如果这篇文章对你有帮助,可以收藏备用,也欢迎在评论区交流你在学习 Linux 过程中遇到的问题。下一讲我们会进一步深入到嵌入式交叉编译与开发工具链实战,我们到时候见。

http://www.cnnetsun.cn/news/4365023.html

相关文章:

  • 海兰德铁道学院最终章:AI实验室本地大模型部署实战
  • C++插件框架实战:接口、ABI与生命周期设计要点
  • 基于STM32和CH455的数码管驱动:从CubeMX配置到HAL库实现
  • 宝可梦女主角全解析:游戏与动画差异及Python偏好评分工具
  • MATLAB Simulink下DPD数字预失真仿真:从记忆多项式到自适应算法全解析
  • iQOO Neo11至尊版深度解析:天玑9500M与9100mAh续航如何重塑游戏体验
  • 智能客服系统哪家好?AI客服软件主流品牌全景评测与选型指南2026
  • FM1208 CPU卡开发:RC522驱动与PSAM圈存系统实现
  • 纯CSS+JS打造真实感音量旋钮:交互原理与音频联动实践
  • 自制自动弹吉他机器人:硬件选型、时序控制与校准排错实战
  • 10天变超人?不如把预期拆成可落地的工程流程
  • MetaEditor汉化与中文乱码解决:MT4编程环境配置完全指南
  • 开源模型驱动自动化任务实战:从能力边界到工程落地
  • ESP32蓝牙HID映射实战:从零打造自定义键盘与鼠标
  • Transformer在M5销量预测中的实战:从数据预处理到模型优化
  • 利用FM子载波与三极管混频器实现137MHz单边带发射
  • 家电行业AI客服系统推荐:智齿科技AI Agent如何破解安装预约与售后报修的产能瓶颈2026
  • 解锁DJI Mino隐藏价值:从设备激活器到移动创作效率中枢
  • 多源位置信号如何交叉关联?FastAPI实现位置情报聚合服务
  • BQ79616与BQ79600菊花链通信底层驱动设计与实现
  • Python Tkinter实战:从零构建桌面计算器应用
  • MATLAB数据拟合实战:从最小二乘到模型验证
  • 西门子S7-1200 PLC实现加热炉温度串级控制:原理、编程与调试
  • Prim2Room:从基元到布局可控的房间网格生成实战拆解
  • CH341 I2C调试完全指南:从硬件连接到波形分析
  • ppd拍拍贷风控大赛数据集实战:信用评估与特征工程全流程
  • 基于IAPWS-IF97的水蒸气物性计算MATLAB函数库开发实战
  • Qt 4.8嵌入式软键盘从零实现:焦点控制与事件发送实战
  • 奥迪MMI系统实用指南:从Audi connect到保养复位全攻略
  • 霍尼韦尔Care 10.05 OEM安装全攻略:授权与加密狗避坑指南