在嵌入式开发中,Linux 系统是绕不开的核心平台。无论是进行交叉编译、驱动调试、系统裁剪,还是远程登录设备、分析日志、管理进程,熟练使用 Linux 命令都是提升开发效率、快速定位问题的关键能力。很多新手开发者面对黑乎乎的终端窗口常常感到无从下手,或者只记得几个基础命令,遇到复杂场景就束手无策。
本文旨在为嵌入式开发者梳理一份从入门到进阶的 Linux 命令实战指南。我们不追求面面俱到的命令大全,而是聚焦于嵌入式开发中最常用、最核心的命令组合与应用场景。通过系统性的讲解和大量可复现的示例,帮助你构建起命令行操作的肌肉记忆,让你在开发板、服务器或虚拟机的终端前更加游刃有余。
1. 为什么嵌入式开发者必须精通 Linux 命令?
在深入具体命令之前,我们首先要理解命令行对于嵌入式开发不可替代的价值。
1.1 环境与资源的限制嵌入式设备往往资源有限(CPU、内存、存储),无法运行图形化桌面环境。通过串口、SSH 等方式登录后,命令行是唯一的高效交互界面。即使是在性能强大的开发主机上进行交叉编译,在构建系统(如 Buildroot, Yocto)、版本控制(Git)、文件传输和远程调试中,命令行工具也是绝对的主力。
1.2 自动化与脚本化嵌入式开发涉及大量重复性工作:代码编译、固件打包、烧录测试、日志收集等。通过 Shell 脚本将一系列命令组合起来,可以实现全流程自动化,极大提升开发效率和一致性,减少人为错误。
1.3 强大的问题诊断能力当程序崩溃、系统卡顿、驱动异常或网络不通时,图形化工具往往无能为力。命令行工具提供了从系统内核、进程、内存、网络到文件系统的全方位深度观测和操控能力。掌握这些命令,就等于拥有了直接与系统内核对话的“手术刀”。
1.4 跨平台与一致性无论是 x86 的开发机、ARM 的开发板,还是 MIPS 的路由器,只要运行 Linux,其核心命令集和行为基本一致。这份技能具有极强的可移植性。
接下来,我们将命令分为几个核心模块,每个模块都围绕嵌入式开发中的典型任务展开。
2. 环境准备与基础认知
在开始练习命令前,你需要一个 Linux 环境。对于嵌入式开发者,常见的环境有:
- 物理开发板:通过串口(使用
minicom,screen,picocom)或网络(SSH)登录。 - 虚拟机:在 Windows/macOS 上安装 VMware/VirtualBox,运行 Ubuntu 等发行版。
- Windows Subsystem for Linux (WSL):在 Windows 上获得接近原生的 Linux 体验。
- Docker 容器:快速创建一个干净、隔离的 Linux 环境,特别适合构建环境。
本文示例基于 Ubuntu 22.04 LTS,但绝大多数命令适用于任何主流 Linux 发行版。请打开你的终端,跟随操作。
首先,认识一下终端和 Shell。我们输入命令的地方叫终端模拟器(Terminal),解释并执行命令的程序叫 Shell(如 bash, zsh)。默认的提示符通常像这样:user@hostname:~$,其中~代表当前用户的家目录(/home/username)。
3. 文件与目录操作:开发的基石
嵌入式开发中,你需要频繁地在主机和目标板之间、在不同源码目录之间穿梭和管理文件。
3.1 导航与查看:pwd,cd,ls
# 1. 显示当前工作目录的绝对路径 pwd # 输出示例:/home/developer/embedded_project # 2. 切换目录 cd /usr/local # 切换到绝对路径 cd .. # 切换到上级目录 cd ~ # 切换到当前用户的家目录 cd - # 切换到上一个所在的目录(非常实用!) cd ../sibling_dir # 切换到兄弟目录 # 3. 列出目录内容 ls # 简单列出 ls -l # 长格式列出,显示权限、所有者、大小、时间等(最常用) ls -la # 长格式并显示所有文件(包括以`.`开头的隐藏文件) ls -lh # 长格式,并以人类可读方式显示文件大小(K, M, G) ls -ltr # 按时间倒序排列,最新的在最后,方便查看最新文件 ls /etc/ # 列出指定目录的内容嵌入式场景:在构建根文件系统时,经常需要ls -l查看交叉编译生成的库文件权限是否正确;使用ls -ltr在编译输出目录中快速找到最新生成的可执行文件或镜像。
3.2 文件操作:cp,mv,rm,touch,mkdir,rmdir
# 1. 复制文件或目录 cp source.c dest.c # 复制文件 cp -r source_dir/ dest_dir/ # 递归复制整个目录 cp -v *.ko /lib/modules/$(uname -r)/ # 复制所有.ko文件到模块目录,并显示过程 # 2. 移动或重命名文件/目录 mv old_name.c new_name.c # 重命名 mv file.c ../src/ # 移动到上级目录的src文件夹 mv dir/ /target/rootfs/usr/bin/ # 移动整个目录 # 3. 删除文件或目录 (⚠️危险操作,谨慎使用!) rm file.o # 删除文件 rm -f file.o # 强制删除,不提示 rm -rf build/ # 递归强制删除整个build目录及其内容 # 警告:`rm -rf /` 或 `rm -rf *` 在错误目录下执行会毁灭性删除数据! # 4. 创建空文件或更新文件时间戳 touch new_file.txt # 创建空文件 touch existing.c # 更新文件访问和修改时间为当前时间 # 5. 创建目录 mkdir new_dir mkdir -p project/{src,include,lib,bin} # 一次性创建多级目录和子目录,结构清晰 # 创建后的目录结构: # project/ # ├── bin # ├── include # ├── lib # └── src # 6. 删除空目录 rmdir empty_dir/嵌入式场景:cp -r用于部署根文件系统;rm -rf用于清理庞大的编译中间文件;mkdir -p在编写安装脚本或构建系统时,用于创建标准的目录结构。
3.3 查看与编辑文件:cat,less,head,tail,vim/nano
# 1. 连接并显示整个文件内容(适合小文件) cat /proc/cpuinfo # 查看CPU信息 cat device_tree.dts > new.dts # 将内容输出到新文件(重定向) # 2. 分页查看文件内容(适合大文件,可上下翻页、搜索) less /var/log/syslog # 按`q`退出,`/`搜索,`n`下一个匹配项 # 在less中,按`Shift+G`直接跳到文件末尾,查看最新日志非常方便。 # 3. 查看文件开头部分 head -n 20 kernel_config.txt # 查看文件前20行 # 4. 查看文件末尾部分(⚠️嵌入式日志分析核心命令!) tail -n 50 /var/log/kern.log # 查看最后50行 tail -f /var/log/app.log # 实时追踪文件末尾新增内容(Follow mode) # 组合使用:实时追踪并高亮错误 tail -f app.log | grep -i --color=always error # 5. 文本编辑器 vim config.txt # 使用vim编辑,功能强大但学习曲线陡峭 nano config.txt # 使用nano编辑,简单易用,适合新手嵌入式场景:tail -f是调试利器,实时观察应用程序或内核的打印信息。cat /proc/version查看内核版本,cat /proc/meminfo查看内存使用情况。less查看长的编译脚本或配置文件。
4. 权限与用户管理:安全与协作的基础
嵌入式系统可能涉及多用户访问或需要特定权限运行服务。
4.1 理解权限:ls -l的输出
执行ls -l后,第一列如-rwxr-xr--:
- 第1位:
-表示普通文件,d表示目录,l表示链接。 - 2-4位:文件所有者的读(r)、写(w)、执行(x)权限。
- 5-7位:文件所属用户组的权限。
- 8-10位:其他用户的权限。
4.2 修改权限:chmod
权限可以用数字(八进制)或符号表示。
- r(读)= 4
- w(写)= 2
- x(执行)= 1
# 数字模式(最常用) chmod 755 my_app # rwxr-xr-x:所有者可读可写可执行,组和其他可读可执行 chmod 644 config.conf # rw-r--r--:所有者可读可写,组和其他只读 chmod +x build.sh # 符号模式:为所有用户添加执行权限 chmod u+x,go-w script.sh # 符号模式:给所有者加执行,去掉组和其他人的写权限4.3 修改所有者和组:chown,chgrp
# 改变文件所有者 sudo chown developer app.bin # 将app.bin的所有者改为developer用户 sudo chown developer:developers app.bin # 同时改变所有者和所属组 # 改变文件所属组 sudo chgrp developers app.bin嵌入式场景:交叉编译出的可执行文件,可能需要chmod +x才能运行。将设备节点(如/dev/ttyUSB0)的权限改为666(chmod 666 /dev/ttyUSB0) 可以让普通用户访问串口,而无需每次都使用sudo。在制作根文件系统时,需要为/etc/shadow等关键文件设置严格的权限(如600)。
5. 进程管理:掌控系统运行状态
嵌入式设备上跑着各种守护进程、应用程序,如何查看和控制它们至关重要。
5.1 查看进程:ps,top,htop
# 1. ps - 查看进程快照 ps # 显示当前终端下的进程 ps aux # 显示所有用户的详细进程信息(最常用组合) ps aux | grep my_app # 查找名为“my_app”的进程 ps -ef # 以完整格式列表显示所有进程 ps -o pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -10 # 自定义输出列,按CPU排序前10 # 2. top - 动态实时查看进程和系统资源 top # 进入交互式视图,按`q`退出 # 在top中:按`P`按CPU排序,按`M`按内存排序,按`1`显示所有CPU核心。 # 3. htop (需要安装) - top的增强版,更直观 sudo apt install htop htop5.2 控制进程:kill,killall,pkill,jobs,fg,bg
# 1. 发送信号给进程 ps aux | grep endless_loop # 先找到进程PID,例如 12345 kill 12345 # 发送默认的TERM(15)信号,请求进程终止 kill -9 12345 # 发送KILL(9)信号,强制杀死进程(万不得已时使用) kill -SIGTERM 12345 # 同上,使用信号名 # 2. 通过进程名操作 killall my_app # 杀死所有名为my_app的进程 pkill -f “python script.py” # 通过完整命令行匹配来杀死进程 # 3. 作业控制(在同一个终端内管理前后台任务) ./long_running_task & # 在后台启动任务 jobs # 查看当前终端的后台作业列表,如[1]+ Running ... fg %1 # 将后台作业1切换到前台运行 # 如果前台任务在运行,按 `Ctrl+Z` 可以将其暂停并放到后台。 bg %1 # 让后台被暂停的作业1继续运行嵌入式场景:ps aux | grep是定位某个守护进程是否存活、查看其 PID 和资源占用的标准操作。当应用程序无响应时,使用kill -9是最后手段。在调试时,可以将一个前台程序挂起(Ctrl+Z),然后用gdb附加调试。
6. 网络诊断与配置:打通设备与世界的桥梁
无论是开发板通过 NFS 挂载,还是通过 SSH 远程登录,网络命令都是必备技能。
6.1 查看与配置:ifconfig/ip,ping,netstat/ss
# 1. 查看和配置网络接口(旧命令:ifconfig,新命令:ip) ifconfig # 查看所有网络接口信息(可能需安装net-tools) ip addr show # 查看IP地址(推荐,功能更强大) ip link show # 查看链路状态 sudo ip addr add 192.168.1.100/24 dev eth0 # 为eth0添加IP sudo ip link set eth0 up # 启用eth0网卡 # 2. 测试网络连通性 ping 192.168.1.1 # 测试到网关的通畅性,按Ctrl+C停止 ping -c 4 google.com # 发送4个包后停止 ping -I eth1 8.8.8.8 # 指定从eth1网卡发出ping包 # 3. 查看网络连接、路由、接口统计(旧命令:netstat,新命令:ss) netstat -tulnp # 查看所有监听端口及对应进程(需sudo看全部) ss -tulnp # ss是netstat的现代替代,更快更高效(推荐) netstat -r # 查看路由表 ip route show # 查看路由表(推荐)6.2 文件传输:scp,sftp,wget/curl
# 1. 安全复制(主机与开发板之间) # 从本地复制到远程 scp app.bin developer@192.168.1.10:/home/developer/ # 从远程复制到本地 scp developer@192.168.1.10:/var/log/kern.log ./ # 递归复制整个目录 scp -r rootfs/ developer@192.168.1.10:/opt/ # 2. 安全文件传输(交互式) sftp developer@192.168.1.10 # sftp> put local_file.txt # sftp> get remote_file.txt # sftp> ls # sftp> quit # 3. 从网络下载 wget https://example.com/toolchain.tar.gz # 下载文件 wget -c https://example.com/large_file.iso # 断点续传 curl -O https://example.com/file.txt # 下载文件 curl -I https://example.com # 仅获取HTTP头部信息嵌入式场景:scp是向开发板部署程序或从开发板抓取日志的最常用方式。ping是检查开发板与主机网络是否联通的第一步。ss -tulnp可以查看自己开发的服务是否在预期端口上成功监听。
7. 系统信息与性能监控
了解设备的资源使用情况,是性能分析和优化的前提。
7.1 资源查看:free,df,du,uname
# 1. 查看内存使用情况 free -h # 以人类可读格式显示内存和交换分区使用量 cat /proc/meminfo # 更详细的内存信息 # 2. 查看磁盘空间使用情况 df -h # 查看所有已挂载文件系统的磁盘使用情况(人类可读) df -h . # 查看当前目录所在分区的使用情况 # 3. 查看文件或目录的磁盘使用量 du -sh project/ # 汇总显示project目录的总大小 du -sh * # 显示当前目录下所有文件和目录的大小 du -h --max-depth=1 /home # 查看/home下第一级子目录的大小 # 4. 查看系统信息 uname -a # 打印所有系统信息(内核名称、主机名、内核版本、硬件架构等) uname -r # 只打印内核版本,在配置内核模块时非常有用 cat /proc/version # 查看内核版本和编译器信息 cat /etc/os-release # 查看发行版信息7.2 性能分析工具:vmstat,iostat,sar(需要安装sysstat)
# 1. vmstat - 报告虚拟内存统计、进程、CPU活动 vmstat 1 5 # 每隔1秒采样一次,共采样5次 # 输出字段:procs(进程)、memory(内存)、swap(交换区)、io(磁盘)、system(系统)、cpu(CPU) # 2. iostat - 报告CPU统计和输入/输出统计 iostat -dx 1 # 显示设备扩展统计,每秒刷新一次 # 3. sar - 系统活动报告器,功能强大 sar -u 1 3 # 查看CPU使用率,每秒1次,共3次 sar -r 1 3 # 查看内存使用情况 sar -n DEV 1 3 # 查看网络接口流量嵌入式场景:free -h和df -h是检查嵌入式设备内存和存储是否耗尽的第一反应。uname -r在编译内核模块时必须使用,以确保模块与当前运行的内核版本匹配。du -sh用于分析根文件系统中哪个目录或应用占用了过多空间。
8. 文本处理三剑客:grep,awk,sed
这是命令行中最强大的文本处理工具,组合使用可以解决大部分日志分析和数据提取问题。
8.1grep:强大的文本搜索
# 基本搜索 grep “error” /var/log/syslog # 在文件中搜索包含“error”的行 grep -i “warning” app.log # 忽略大小写搜索“warning” grep -r “main” ./src/ # 递归搜索当前src目录下所有文件 # 高级用法 grep -v “debug” log.txt # 输出不包含“debug”的行(反向选择) grep -E “[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+” log.txt # 使用扩展正则匹配IP地址 grep -c “timeout” log.txt # 统计匹配到的行数 grep -n “segmentation” log.txt # 显示匹配行及其行号 ps aux | grep -v grep | grep my_app # 在进程列表中精确查找,排除grep进程本身8.2awk:文本分析和报告生成工具
awk将文件视为由字段组成的行,非常适合处理表格化的数据。
# 打印文件的第1列和第3列(默认以空格或制表符分隔) awk ‘{print $1, $3}’ data.txt # 打印登录shell为`/bin/bash`的用户名(来自/etc/passwd) awk -F: ‘$7 == “/bin/bash” {print $1}’ /etc/passwd # 计算文件第一列数字的总和 awk ‘{sum += $1} END {print sum}’ numbers.txt # 结合ps命令,找出CPU使用率超过5%的进程 ps aux | awk ‘$3 > 5.0 {print $11, $3}’ # 分析日志,统计每种HTTP状态码出现的次数 awk ‘{print $9}’ access.log | sort | uniq -c | sort -rn8.3sed:流编辑器,用于文本替换、删除、插入
# 将文件中所有的“foo”替换为“bar”,只输出到屏幕 sed ‘s/foo/bar/g’ input.txt # 直接修改文件(-i选项) sed -i ‘s/old_ip/new_ip/g’ config.yaml # 删除包含“debug”的行 sed ‘/debug/d’ log.txt # 删除文件第10行 sed -i ‘10d’ file.c # 在匹配行“server {”之后插入一行配置 sed -i ‘/server {/a \ listen 8080;’ nginx.conf嵌入式场景:
grep:从海量内核日志 (dmesg) 或应用日志中快速过滤出错误 (ERROR)、警告 (WARN) 或特定模块的打印信息。awk:分析/proc/net/dev获取精确的网络流量统计;解析ps aux输出计算所有进程的总内存占用。sed:在批量修改构建脚本中的路径、配置文件中的IP地址时,效率远高于手动编辑。
9. 压缩与归档:节省空间与方便传输
嵌入式系统的存储空间宝贵,源码和固件也常以压缩包形式分发。
# 1. tar - 打包和解包(不压缩) tar -cvf project.tar ./project/ # 创建归档文件(c:创建,v:详细,f:指定文件) tar -xvf project.tar # 解包归档文件(x:提取) tar -tvf project.tar # 查看归档文件内容列表(t:列表) # 2. tar + gzip (最常用组合 .tar.gz 或 .tgz) tar -czvf project.tar.gz ./project/ # 打包并用gzip压缩 tar -xzvf project.tar.gz # 解压gzip压缩的tar包 # 3. tar + bzip2 (压缩率更高,但更慢 .tar.bz2) tar -cjvf project.tar.bz2 ./project/ tar -xjvf project.tar.bz2 # 4. tar + xz (压缩率非常高,常用于发行版 .tar.xz) tar -cJvf project.tar.xz ./project/ tar -xJvf project.tar.xz # 5. zip/unzip (跨平台常用) zip -r project.zip ./project/ # 递归压缩目录 unzip project.zip # 解压zip文件 # 6. gzip/gunzip, bzip2/bunzip2 (仅压缩单个文件) gzip large_file.log # 压缩,生成 large_file.log.gz gunzip large_file.log.gz # 解压 bzip2 large_file.log # 压缩,生成 large_file.log.bz2 bunzip2 large_file.log.bz2 # 解压嵌入式场景:从官网下载的工具链(如gcc-arm-linux-gnueabihf.tar.xz)需要用tar -xJvf解压。将编译好的根文件系统目录打包成rootfs.tar.gz用于烧录或传输。使用gzip压缩旧的日志文件以节省空间。
10. 查找与定位:find,which,whereis,locate
在庞大的源码树或系统中快速找到文件。
# 1. find - 最强大、最常用的查找命令 find . -name “*.c” # 在当前目录及子目录查找所有.c文件 find /home -user developer # 查找/home下所有者为developer的文件 find /var/log -type f -mtime -7 # 查找/var/log下7天内修改过的普通文件 find . -size +10M # 查找当前目录下大于10MB的文件 find . -name “*.o” -delete # 查找并删除所有.o文件(⚠️先不加-delete测试!) find . -perm 755 # 查找权限为755的文件 # 组合操作:找到.c文件并统计行数 find ./src -name “*.c” -exec wc -l {} \; # 2. which - 查找可执行文件的路径 which gcc # 输出:/usr/bin/gcc which ls # 3. whereis - 查找二进制文件、源码和手册页的位置 whereis ls # 输出:ls: /bin/ls /usr/share/man/man1/ls.1.gz whereis -b ls # 只查找二进制文件 # 4. locate (需要安装mlocate) - 基于数据库快速查找,但结果可能不是实时 sudo updatedb # 首先更新数据库(需要sudo权限) locate stdio.h # 快速查找所有包含stdio.h路径的文件嵌入式场景:在 Buildroot 或 Yocto 构建的输出目录中,用find -name “*.ko”查找所有编译好的内核模块。用which arm-linux-gnueabihf-gcc确认交叉编译器是否在 PATH 中。用find . -type f -name “*.log” -size +100M找出占用巨大空间的老日志文件以便清理。
11. 综合实战:一个嵌入式开发调试场景
假设你通过 SSH 登录到一台远程嵌入式设备,应用程序my_daemon疑似内存泄漏,你需要进行诊断。
# 1. 首先,确认进程是否存在,并获取其PID ps aux | grep my_daemon | grep -v grep # 输出可能为:root 1234 0.5 8.2 24576 82000 ? Sl 10:00 12:34 /usr/bin/my_daemon # 2. 实时查看该进程的资源占用(CPU、内存) top -p 1234 # 或者使用更直观的htop,然后在里面过滤该PID。 # 3. 查看该进程打开的文件和网络连接 lsof -p 1234 # 列出进程打开的所有文件描述符 ss -tunap | grep 1234 # 查看该进程相关的网络连接 # 4. 追踪系统调用和信号(需要sudo或root权限) strace -p 1234 # 跟踪进程的系统调用,看是否卡在某个调用上 # 按 Ctrl+C 停止 strace。 # 5. 查看该进程的内存映射 pmap 1234 # 显示进程的内存映射 cat /proc/1234/maps # 另一种查看内存映射的方式 cat /proc/1234/status # 查看进程详细状态信息,包括VmRSS(实际物理内存) # 6. 持续监控内存增长(写一个简单循环) while true; do ps -p 1234 -o pid,ppid,%cpu,%mem,rss,vsz,cmd sleep 2 done # 观察 RSS (Resident Set Size) 是否持续增长。 # 7. 如果怀疑是某个库函数调用频繁,可以使用 ltrace ltrace -p 1234 -c # 统计库函数调用次数(可能需要安装) # 8. 收集日志进行分析 tail -f /var/log/my_daemon.log | grep -E “(error|fail|leak)” --color=auto # 或者将一段时间内的日志保存下来 cp /var/log/my_daemon.log /tmp/daemon_$(date +%Y%m%d_%H%M%S).log # 9. 如果问题复现,生成核心转储(core dump)供后续分析 # 首先确保系统允许生成core dump ulimit -c unlimited # 然后发送特定信号(如 SIGABRT)给进程,或在代码中触发abort kill -SIGABRT 1234 # core dump 通常会生成在当前目录或指定目录,名为 `core` 或 `core.<pid>`这个流程几乎涵盖了从初步检查到深度分析的所有常用命令组合。掌握它们,你就能独立应对大部分线上调试问题。
12. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查命令与思路 |
|---|---|---|
命令找不到(command not found) | 1. 命令未安装。 2. 命令路径不在 $PATH环境变量中。 | which command_name检查路径。echo $PATH查看 PATH。find / -name “command_name” 2>/dev/null全盘查找。 |
权限被拒绝(Permission denied) | 1. 当前用户对文件/目录没有相应权限。 2. 尝试执行一个非可执行文件。 3. SELinux/AppArmor 安全模块限制。 | ls -l查看文件权限和所有者。groups查看当前用户所属组。尝试使用 sudo(如有权限)。 |
磁盘空间不足(No space left on device) | 1. 分区确实已满。 2. inode 耗尽(小文件过多)。 | df -h查看各分区使用情况。df -i查看 inode 使用情况。du -sh * | sort -rh | head -10找出占用空间最大的前10个目录。 |
进程无法杀死(kill -9无效) | 1. 进程处于D状态(不可中断睡眠),通常由 I/O 问题导致。2. 进程是僵尸进程 ( Z)。 | ps aux | grep <pid>查看进程状态。对于 D状态,尝试排查底层存储或驱动问题。对于僵尸进程,需要其父进程回收,可尝试杀死父进程。 |
| 网络连接失败 | 1. 网络接口未启动或配置错误。 2. 防火墙规则阻止。 3. 服务未监听。 | ip addr show或ifconfig查看接口和IP。ping <gateway>测试网关连通性。ss -tulnp | grep <port>检查服务监听状态。sudo iptables -L -n查看防火墙规则。 |
| 文件被占用无法删除 | 1. 有进程正在使用该文件。 | lsof | grep <file_name>查找是哪个进程打开了文件。停止该进程,或使用 kill -9 <pid>强制停止。 |
Shell脚本执行错误(syntax error,unexpected token) | 1. 脚本格式问题(如Windows换行符)。 2. 解释器路径错误。 | cat -A script.sh查看是否包含^M(Windows回车符)。使用 dos2unix转换。检查脚本首行 shebang ( #!/bin/bash) 是否正确。 |
13. 最佳实践与工程建议
善用命令历史与补全:
- 按
Ctrl+R可以反向搜索历史命令。 - 使用
history查看所有历史命令,并用!编号快速执行。 - 在输入命令或路径时,多按
Tab键自动补全,能有效避免拼写错误。
- 按
理解命令原理,善用
man和--help:- 遇到新命令或不熟悉的参数,第一时间
man command或command --help。man手册是权威文档。
- 遇到新命令或不熟悉的参数,第一时间
组合命令,构建管道:
- Linux 哲学是“一个命令做好一件事”。通过管道
|将多个命令组合,可以完成复杂任务。例如:ps aux | grep python | awk ‘{print $2}’ | xargs kill -9。
- Linux 哲学是“一个命令做好一件事”。通过管道
操作前先确认,危险操作三思:
- 对于
rm -rf、dd、chmod -R 777 /等危险命令,执行前务必双重检查路径。 - 可以先使用
echo或ls预览将要操作的文件。例如:rm -rf ./build/前,先ls -la ./build/确认。
- 对于
编写可复用的脚本:
- 将常用的复杂命令序列保存为 Shell 脚本 (
*.sh),并添加执行权限 (chmod +x)。 - 在脚本开头使用
set -e使得脚本在遇到错误时立即退出,避免雪崩。 - 添加清晰的注释和日志输出。
- 将常用的复杂命令序列保存为 Shell 脚本 (
管理好环境变量:
- 交叉编译器的路径 (
PATH)、架构变量 (ARCH,CROSS_COMPILE) 通常通过环境变量设置。 - 建议在
~/.bashrc或项目专用的setup_env.sh脚本中设置,避免每次手动输入。
- 交叉编译器的路径 (
日志是生命线:
- 为你的嵌入式应用程序配置合理的日志级别(INFO, WARN, ERROR)。
- 使用
logger命令或 syslog 将日志写入系统日志设施,便于用journalctl或查看/var/log/统一管理。 - 定期使用
logrotate等工具归档和清理旧日志,防止占满存储。
掌握这些命令和最佳实践,你就能在嵌入式 Linux 的世界里高效地开发、调试和维护。真正的熟练来自于持续的实践,建议你在自己的开发环境中反复练习这些命令,并尝试解决实际遇到的问题。当你能够不假思索地运用它们时,命令行将不再是障碍,而是你手中最得力的工具。