
说实话每次有人问我“Linux该从哪学起”我的回答都特别一致先把基础指令打扎实。很多新手一上来就奔着“Linux内核源码分析”“嵌入式驱动开发”去结果连ls的参数都没记全写个脚本还要现查cp的用法这种状态去碰系统底层纯属给自己找罪受。这篇《Linux基础指令介绍·上》就是给准备入坑的开发者、运维、测试和嵌入式方向的同学准备的。不用管你以后是写后端、调服务器还是搞单片机交叉编译这些指令都是绕不开的第一道门槛。这篇我会先把文件目录操作、文件内容查看、权限管理和几个能显著提升效率的小习惯讲透更进阶的进程管理、网络配置、文本处理三剑客留到下一篇再聊。1. 先搞明白为什么Linux基础指令值得认真学1.1 图形界面能搞定的事为什么还要敲命令很多刚接触Linux的人都有个疑问桌面上点来点去不也能操作文件吗为什么非得让我背命令道理其实很简单。你平时自己电脑上用的Ubuntu桌面版、Deepin这些确实有图形界面可一旦到了服务器环境情况完全变了。我最早实习的时候公司分给我一台云服务器SSH连上去就是一坨黑底白字的终端没有桌面连个图标都看不到。生产环境为了稳定和省资源绝大多数都没有图形界面你唯一的操作入口就是命令行。这个场景从云服务器、物理机到嵌入式开发板全是同一个逻辑。更进一步说命令行的价值在于可组合、可自动化。你在图形界面里复制十个文件得点十次鼠标但写成一行for i in {1..10}; do cp a.txt file_$i.txt; done一条命令就搞定了。你在图形界面里没法做的事——比如命令执行完自动发封邮件通知你、检查日志文件有没有新增错误、每天凌晨三点自动备份数据库——这些全部依赖命令行。图形界面像开车挂了个自动挡省心但精细控制有限命令行像手动挡虽然入门要费点心思但一旦熟练那种“把机器安排得明明白白”的感觉确实很爽。1.2 理解Linux的目录逻辑一切从根开始学基础指令之前得先建立Linux的目录观。Linux的目录结构跟Windows那种C盘D盘完全不一样它是一棵倒挂的树最顶端是根目录/所有目录和文件都挂在它下面。先记住这几个关键位置的用途后面操作会很顺手/根目录一切从这里开始/etc系统配置文件的家比如网络配置、软件源列表都在这里/var动态数据日志文件在/var/log下/home普通用户的家目录对应每个用户的个人文件/tmp临时文件目录重启一般会被清空/bin和/sbin系统命令存放位置ls、cp都在这类目录里还有一个新手容易懵的点Windows用反斜杠\分隔路径Linux用正斜杠/。这个习惯越早改越好不然你在键盘上找半天反斜杠系统只会回你一句“No such file or directory”。另外Linux下的路径分绝对路径和相对路径。绝对路径从根目录写起例如/home/test/temp/file.txt相对路径从当前目录出发例如./temp/file.txt或者../temp/file.txt。..表示上一级目录.表示当前目录这两个符号在后续操作里会反复用到。2. 文件与目录操作最常用的一组基础指令2.1 先学会不迷路pwd、ls、cd 的组合用法在任何系统里你首先得知道自己在哪、周围有什么然后才能去别的地方。对应到Linux就是三个基础指令pwd、ls、cd。pwdprint working directory用来打印当前所在的工作目录。我见过很多新手敲命令敲到一半突然找不到方向一个pwd就知道自己身处何方了这个命令不需要任何参数往回敲就对了。ls可能是你用得最多的命令。裸敲ls只会显示文件名我强烈建议你直接养成用参数的习惯ls -l # 显示详细信息权限、属主、大小、修改时间 ls -a # 显示隐藏文件.开头 ls -lh # 文件大小以人类可读方式显示K、M、G ls -lt # 按修改时间排序最新的在最上面ls -l的输出信息量很大我逐个拆开讲一下。比如这一行-rw-r--r-- 1 root root 4096 Mar 5 10:30 test.txt第一个字符-表示这是一个普通文件如果是d则是目录后面的9个字符分成三组依次是属主权限、属组权限、其他人权限每组三个位置对应r读、w写、x执行没有权限显示-。再往后是硬链接数、属主root、属组root、大小4096字节、最后修改时间、文件名。这个格式后面讲权限管理时还要细说这里先混个眼熟。cdchange directory用于切换目录也有几个高频用法cd # 回到当前用户的家目录等效 cd ~ cd /var/log # 绝对路径跳转 cd ../ # 回到上一级 cd - # 回到上一次所在的目录来回切换特别好用这里必须强调**cd、ls、pwd这三个指令建议在一个终端里反复敲目录切换的感觉找对了后面才能顺**。我见过有人用cd去跳一个不存在的目录系统报错后整个人懵住了其实错误信息写得清清楚楚这叫No such file or directory只是你还没习惯看报错而已。2.2 创建与删除mkdir、touch、rmdir、rm 的正确姿势有浏览就必然有增删。mkdirmake directory用于创建目录mkdir mydir # 创建单级目录 mkdir -p a/b/c/d # 递归创建多级目录父目录不存在时自动创建 mkdir -m 755 mydir # 创建时直接指定权限-p这个参数我几乎每次部署项目都会用到。比如你要创建/opt/app/logs如果/opt/app不存在不带-p直接报错带-p它会一路帮你把父目录都建好。新手写脚本时特别容易漏这个参数记住了能少踩很多坑。touch有两个用途创建空文件或者更新已有文件的修改时间。你初始化项目时想快速生成一堆占位文件就可以touch README.md touch config.inirmdir只能删除空目录鸡肋得很实际工作中大家基本都用rm -r。然后说到rm这个命令必须严肃对待。删除单个文件用rm test.txt删除目录需要加-r参数表示递归顺手配合-f可以强制删除不提示force。于是江湖上流传着一个著名的自杀式指令rm -rf /注意千万别手滑。-rf加在/上就是删根目录轻则系统报废重则把你运行中的服务、数据库文件全带走。我见过不止一次群里有人发截图问“不小心执行了 rm -rf /usr 怎么办”我只能回复“节哀重装吧”。给你的建议是不要在关键目录比如家目录、/etc附近手滑尤其是用root账户操作时。如果你实在没底可以先rm -i试试它会逐个文件确认或者干脆把rm -i设成别名后面会讲。还有一个思路值得学习生产服务器上不要直接删数据先把要删的文件移动到 /tmp 目录观察一段时间没问题再真正清理。用社区里流行的话说“删除一时爽找回复原火葬场”多加一道“软删除”的工序保平安。2.3 移动与复制cp、mv 的细节与坑文件要搬要拷就得靠cpcopy和mvmove。cp的基本用法cp source.txt dest.txt # 复制文件 cp -r dir1/ dir2/ # 递归复制整个目录 cp -p file1 file2 # 保留原文件的属性时间戳、权限等 cp -i file1 file2 # 覆盖前询问建议加上 cp -v file1 file2 # 显示复制过程verbose模式-r这个参数我几乎可以断言每个新手都漏过一次。复制目录不加-r系统直接报omitting directory意思是你忽略了一个目录。这个报错英文看起来挺复杂实际上就是告诉你“兄弟这是目录得加 -r 才行”。mv的用法相对优雅它既能移动文件也能重命名mv old.txt new.txt # 重命名 mv file.txt /tmp/ # 移动到其他目录 mv -i source dest # 覆盖前询问mv有一个隐藏细节如果目标路径在同一个文件系统内mv实际上是一次“改名字”操作瞬间完成如果跨文件系统比如从/tmp移动到挂载的另一块磁盘系统会先复制再删除速度会明显变慢。理解了这一点你就不会奇怪为什么在服务器上移动一个大目录等了半天还没结束。实际工作中还有一个常见需求批量重命名文件。基础指令阶段先不用学rename但你可以用简单的for循环加mv实现。比如给当前目录下所有.txt文件加个backup_前缀for f in *.txt; do mv $f backup_$f; done这一行能跑通你对变量的理解就已经入门了。3. 查看文件内容从 cat 到 grep 的管道思维3.1 cat、less、head、tail按需看文件文件创建好了接下来就是怎么读。很多人跟我说“Linux下打开文件好麻烦”其实是你没选对工具。cat是最直觉的命令把整个文件内容一次性输出到终端cat file.txt cat -n file.txt # 显示行号cat适合小文件几十行以内的配置看一下很舒服。但如果文件有几万行你就别用cat了终端会被刷得密密麻麻想找一行内容简直大海捞针。这时候用lessless large.logless是个交互式翻页工具进入之后按空格翻下一页按b翻上一页按/关键词搜索按q退出。它不会一次性把整个文件塞进内存所以打开几百MB的日志文件也扛得住。我排查线上问题时终端不变的配置永远是tail -f加less双打的。head和tail分别看文件开头和结尾head -n 20 file.txt # 看前20行 tail -n 50 file.txt # 看最后50行 tail -f app.log # 实时跟踪文件新增内容按 CtrlC 退出tail -f是运维排查最常用的命令没有之一。你可以在一个终端里开着它另一个终端去操作服务每次日志文件有新行写入它立刻显示出来。调试web程序、看应用启动日志它都是标配工具。个人经验凡是“为什么我的服务没反应”这种问题第一件事就是tail -f盯日志比瞎猜强一百倍。3.2 grep 与管道让指令学会协作如果说有一组技能让Linux命令行从“普通”变成“强大”那一定是管道和grep。grep的功能是在文件或文本中搜索匹配的内容grep error app.log # 在日志中搜包含error的行 grep -i error app.log # 忽略大小写 grep -n error app.log # 显示行号 grep -v DEBUG app.log # 排除包含DEBUG的行 grep -r TODO ./src/ # 递归搜索目录下所有文件而管道符|的作用是把左边命令的输出作为右边命令的输入。不用背概念看例子就懂了ls -l /etc | grep conf # 找出 /etc 下名字里带conf的文件 history | grep vim # 在历史记录里找之前敲过的vim命令 cat app.log | grep ERROR | tail -n 20 # 看最后20条错误管道的哲学就在于组合。单看grep、tail、cat每个都不起眼但把它们串起来就能完成类似“从100万行日志里找最近5条报错”这种高级操作。这个“小工具组合成大能力”的设计思想其实与乐高积木很像——单个模块能力有限但标准的接口让它们能无限拼接。我们团队有个新人兄弟刚开始不习惯管道总问我“有没有一个工具能把日志过滤完再显示最后几条”我告诉他“不需要新工具现有工具串联一下就有了”。这就是Linux的魅力命令不是功能孤岛而是可以自由组合的积木。3.3 wc、sort、uniq几行命令完成文本统计这部分算是“小惊喜”让你看到命令行做统计也能很顺手。wcword count统计行数、单词数、字节数wc -l file.txt # 统计行数 wc -w file.txt # 统计单词数sort对文本行排序uniq去除连续重复的行。注意uniq只能去重相邻的重复行所以通常要配合sort先把重复行归到一起sort access.log | uniq -c | sort -rn这行命令的含义是把访问日志排序统计每个IP出现的次数然后按出现次数降序排列。它是我做访问统计时的最爱一条命令就能读出访问量Top的IP。拆开来看sort access.log # 按字典序排序 uniq -c # 连续重复行合并并加上出现次数 sort -rn # 按第一列数字次数反向排序-n是数字序-r是降序实际效果类似这样256 192.168.1.100 189 192.168.1.200 45 10.0.0.15这种“文本处理三兄弟”组合在日志分析场场景里出镜率极高。你现在不用背参数表只要记住“排序、去重、计数”这三步套路后面遇到“统计XX次数”的需求就能自然想到。4. 用户、权限与系统信息理解Linux的安全模型4.1 用户身份whoami、id、su、sudo 的区别Linux是个多用户系统所以你在里面敲命令时始终要明白“我是谁”。whoami直接告诉你当前用户名非常简单$ whoami aliceid给的信息更全展示UID、GID和所属组$ id uid1000(alice) gid1000(alice) groups1000(alice),4(adm),27(sudo)然后就是两个经常被搞混的命令su和sudo。su是switch user意思是完全切换用户。su - root会切换成root用户并加载root的环境变量。但你要知道使用su切换到root需要输入root的密码这在生产环境基本上要禁止没有人会把root密码随意公开。sudo是superuser do意思是以另一个用户身份执行单条命令。日常用得最多的是临时提权sudo apt update sudo systemctl restart nginx执行时只需输入当前用户自己的密码验证通过之后在缓存时间内不需要重复输入。更重要的是**sudo可以细分授权**——管理员可以在/etc/sudoers里指定某个用户只能执行哪些命令例如只允许restart特定服务其他命令无权执行。所以一个稳妥的方针是日常用普通用户需要提权时用 sudo而不是长期开着 root 终端。我见过不少新手全程root操作一个误敲rm -rf就真的后悔莫及。如果出现alice is not in the sudoers file的报错说明这个用户没有sudo权限要找管理员把它加进sudo组或者在/etc/sudoers里配置。不要试图自己vim /etc/sudoers乱改语法错了所有用户都提不了权那就真的叫“自己把自己锁在门外了”。4.2 权限管理的核心chmod 与 chownLinux的权限模型初学者总觉得抽象其实就三个角色属主、属组、其他人乘三种权限读、写、执行。前面ls -l看到的-rw-r--r--就是权限的编码。chmod用来修改权限推荐掌握数字表示法。规则很简单r读 4w写 2x执行 1把三者相加就得到一个数字例如7 rwx5 r-x4 r--6 rw-。然后用三个数字分别表示属主、属组、其他人chmod 755 script.sh # 属主rwx属组r-x其他人r-x chmod 644 config.txt # 属主rw-属组r--其他人r--实际场景非常典型脚本文件要能执行就得有x权限。新手写了个.sh脚本执行时报Permission denied基本都是因为没加执行权限chmod x script.sh ./script.sh还有一个高频组合chmod 600 id_rsa # SSH私钥只允许属主读写密钥文件权限过宽会被拒绝连接如果SSH连服务器发现Permissions 0644 for id_rsa are too open就说明你把私钥权限设太宽了改成chmod 600立刻就好。chown修改文件属主和属组chown alice file.txt # 修改属主为alice chown alice:developers file.txt # 同时修改属主和属组 chown -R alice:developers /opt/app/ # 递归修改目录下所有内容最常见的场景是部署应用时把项目目录归属给运行该服务的用户。比如Nginx默认以www-data用户运行如果你上传的文件属主是root那么Nginx可能没权限读取——这时候一条chown -R www-data:www-data /var/www/html就能解决问题。说到底权限问题八成都是在告诉你“当前用户对某个文件没有相应权限”。看懂报错比记住参数表更重要Permission denied就一个字一个字地看它会告诉你缺的是读、写还是执行。4.3 系统状态查看df、free、uname学指令的过程中偶尔也要抬头看看“这台机器整体啥情况”。几个零基础也能快速上手的状态指令df -h # 查看磁盘使用情况-h 以人类可读格式显示 free -h # 查看内存使用情况 uname -a # 查看内核版本和系统架构 date # 查看系统时间 uptime # 查看系统运行时长和负载df -h输出里重点关注根分区的Use%如果跑到90%以上系统可能开始出现日志写不进去、服务启动失败等各种诡异问题。清理磁盘时常用的一招就是结合du找大目录du -sh /var/log/* | sort -hr | head -10这条命令的意思是列出/var/log下每个目录的大小按大小降序取前10个。磁盘满了的时候这是我第一个会执行的命令。free -h要注意Linux的内存设计free显示的值很小不代表真的不够用因为Linux会把空闲内存用作缓存。判断内存是否吃紧主要看available一列它才是真正可分配给新进程的内存量。这几条命令不常用但关键时刻救命。系统卡出毛病时它们就是你的体温计和血压计。5. 提升效率的习惯tab补全、历史记录与重定向5.1 tab补全与通配符不再打错命令名说实话如果只让我提一个“指数级提升效率”的习惯那必须是tab补全。Linux终端里输入命令、文件名、目录名的前几个字符按一下Tab键系统会自动补全。如果有多条匹配按两下直接列出所有可选内容。这个动作看着不起眼实际用起来体验是天壤之别一个长路径名手动敲既慢又容易错但用tab补全几乎不可能输错。我见过很多人还在慢吞吞敲完整路径真的替他们的时间心疼。通配符则是另一种“自动批量选择”常用三个*匹配任意字符例如*.log匹配所有以.log结尾的文件?匹配单个字符例如file?.txt匹配 file1.txt、file2.txt[abc]匹配括号内任一字符例如file[12].txt匹配 file1.txt 或 file2.txt举个例子想删除所有.tmp结尾的临时文件rm *.tmp想列出名字是access_log、error_log两个文件ls *_log通配符跟其他命令配合起来会让批量操作变得非常顺手。但注意通配符会先展开再执行所以rm *这种操作要格外小心它会匹配到当前目录所有非隐藏文件一旦敲下去又没加-i覆水难收。5.2 history 与 alias把敲过的命令变成资产你有没有过这种经历昨天明明敲过一条很复杂的命令今天想再敲一次结果怎么都想不起来了。这时候history就派上用场了。history # 列出本次登录执行过的所有命令 history | grep docker # 筛出和docker相关的历史命令更高效的是按CtrlR进入反向搜索模式输入关键词终端会帮你自动匹配最近的匹配项再按一下继续往前翻。这是我一天按几十次的高频操作强烈推荐养成本能。!系列也有小用处!! # 执行上一条命令 !ls # 执行最近一条以ls开头的命令比如你刚执行一条命令发现权限不够可以sudo !!直接以sudo身份重跑上一条不用重打一遍。这种“小聪明”在服务器上排查问题时特别提气。alias用来定义自己的快捷命令。作为普通人我建议新人在家目录下的~/.bashrc里加上两个保命别名alias llls -lh alias rmrm -i第一条让ll成为详细信息列表的快捷方式第二条强制rm在删除前确认。修改完别忘source ~/.bashrc或者重开一个终端让它生效。我给所有新人的口头禅都是“先给 rm 上个保险再谈效率。”5.3 重定向指令的输出可以“接力”默认情况下命令的输出显示在终端上但有时我们需要把它存到文件里或者把错误信息和正常信息分开这就用到重定向。三种最常用形式echo hello output.txt # 覆盖写入文件不存在则创建 echo world output.txt # 追加写入不覆盖原内容 ls -l 2 error.log # 2 表示只保存错误输出/dev/null是个特殊的“黑洞设备”写入它的内容会直接消失常用于丢弃不需要的输出ls -l /nonexistent 2/dev/null # 错误信息不显示一个经典的需求把命令的标准输出和错误输出分别存到不同文件./script.sh stdout.log 2 stderr.log如果希望把正常输出和错误都汇总到一个文件./script.sh all.log 21这几个符号别死记用几次就懂了。我跑定时任务脚本时最常干的事就是把脚本输出重定向到日志文件里——这样即使你退出了终端命令的结果也能被完整保留下来。6. 初学者最常踩的坑问题排查速查表学指令的过程必然伴随着报错。与其怕报错不如学会站在报错信息的角度思考。下面是我这些年看到新人踩得最多的几个坑整理成一张速查表报错现象可能原因解决办法command not found命令不存在或不在当前PATH路径里检查拼写which 命令名看是否存在Permission denied权限不足或文件没有执行权限ls -l看权限需要时chmod x或加sudoNo such file or directory路径写错了文件/目录不存在pwd确认当前目录用绝对路径或tab补全bash: ./script.sh: /bin/bash^M: bad interpreter脚本是Windows格式换行符不对用sed -i s/\r$// script.sh去掉CR字符rm: cannot remove xxx: Is a directory直接删目录但没加-r改为rm -r或者用rmdir仅空目录is not in the sudoers file当前用户没有sudo权限用root执行usermod -aG sudo username或联系管理员排查的顺序也有讲究我自己的习惯是倒着看输出先看最后一行报错搞清是哪条命令出的问题再看中间有没有上下文信息。很多时候一行tail -n 5就能定位是哪一步出了问题。然后就是“命令工具”的验证链which 命令名 # 确认命令是否在PATH里 type 命令名 # 查看命令类型内置命令、别名还是外部程序 man 命令名 # 查看权威帮助文档按q退出这里要特别提一下Windows下编辑脚本导致/bin/bash^M的问题。很多同学在Windows记事本里写了.sh脚本传到Linux一执行就报错原因就是Windows的换行是\r\n而Linux只认\n。解决办法很简单执行一次sed -i s/\r$// script.sh把多余的回车符去掉就行。这种事我几乎每个季度都要帮人处理一次如果你用VS Code编辑也记得把右下角行尾序列改成LF。还有一个新手极容易忽视的“坑”不要在root下乱试不认识的命令。你可能只是好奇敲了一条网上随手抄来的“一键优化”脚本结果它执行了rm -rf系列操作系统当场就废了。在生产服务器上安全第一永远是铁律。先在一个普通用户环境里试试或者开个虚拟机随便折腾都比直接拿生产环境当实验田强。最后再分享一个老生常谈但真的很有效的建议看完这些指令别急着关页面打开终端把所有命令亲手敲一遍。敲命令这件事手感和肌肉记忆比“眼睛看会了”有用得多。你可以开一台虚拟机或者用云服务器把ls -l、cd /etc、grep -r这些操作从头到尾过一遍亲眼看一遍ls -l那串权限字符长什么样亲手制造一次Permission denied再去chmod x把它解决。这套基础指令我在公司内部带新人时讲过不下十遍每一次都有新手在实操中提出新问题。但万变不离其宗——文件和目录的操作是地基管道的组合思维是灵魂权限的理解是安全底线。把这三大块吃透Linux的大门才算真正被你推开了一条缝。下一篇我会继续讲进程管理、网络配置和文本处理三剑客那些才是让你从“会用”进阶到“能干活”的关键内容。