说实话我到现在都不敢说自己“会Linux”顶多算是“能磕磕绊绊地让它干活”。从第一次照着教程敲ls看到文件列表那一刻起我就掉进了这个当初以为“只是多个窗口的黑底白字界面”的坑里。这篇 Linux 初学者笔记已经是第三篇了前两篇记录了我从装虚拟机到第一次成功用命令行写完一个脚本的过程这一篇则想聊聊最近这段时间被高频搜索的词反复“教做人”的经验——linux常用命令背后的动作逻辑、在系统里装 Python 和 GCC 时那些不自己折腾就永远碰不到的细节、虚拟机里反复重启的崩溃瞬间以及第一次动手写脚本让系统自己跑任务的成就感。如果你也是一边看教程一边敲命令、经常被各种报错按在地上摩擦的初学者这篇笔记可能会有不少能对号入座的地方。1. 从“只会ls”到敢折腾系统我这段时间的学习路径1.1 这篇“第三篇”到底想补什么写前两篇的时候我还在纠结“cd和ls的区别”“vim怎么退出”这种问题最熟练的操作是“敲错命令后疯狂按CtrlC”。但到了第三篇这个阶段我的状态发生了两个比较明显的变化一是不再害怕报错了看到command not found第一反应不是“完蛋了”而是“哦这命令没装”或者“PATH不对”二是开始敢动系统了敢删文件、敢改配置、敢装软件甚至敢在自己的用户目录下写脚本让系统批量干活。这两个变化来自一个很朴素的学习方式带着问题去折腾。比如我那天想把下载目录里的几十个文件按日期批量重命名用鼠标一个一个改实在太痛苦于是第一次认真去搜“linux 用shell重命名文件”结果发现无非是一个mv加一个循环的事。又比如我想看看系统时间到底准不准就去找“linux查看系统时间同步时间”于是碰到了timedatectl和chrony。这类“想干一件事然后去学对应的命令”的学习路径比抱着《Linux命令行大全》从头翻到尾有效得多。这篇笔记本质上就是把我最近“想干的事”和“学到的命令”之间的对应关系整理出来。1.2 初学者最容易走进的误区把命令当咒语我在学习的过程中踩过一个大坑把命令当成咒语来背却不知道它背后的动作逻辑。比如rm -rf /some/path我只知道“删东西用这个”却不清楚-r是递归-f是强制更不知道这些参数组合起来意味着什么。直到有一次我在网上看到有人把命令写错了把项目的logs目录删成了别的什么东西才意识到命令不是咒语是动作的精确描述。所以在后面的内容里我会尽量讲清楚每条命令的“动作逻辑”而不只是列出来告诉你“这个能删文件”。尤其是rm、mv、useradd这类有一定危险性的命令只有理解了它们到底在执行什么操作你才敢放心用也才知道什么时候不能乱用。2. 高频命令背后的动作逻辑删除、重命名、建用户根本没那么玄乎2.1 删除文件夹rm的“破坏力”与保险写法先说说被问得最多的“linux删除文件夹命令”。很多人第一次搜到这个话题看到答案是rm -rf 文件夹名然后就把这六个字符当成万能的删除咒语直到某一天发现自己敲错了路径或者少打了一个字符。rm这个命令的动作逻辑很直白r代表递归recursive没有它rm只能删单个文件f代表强制force没有它系统会对你“确认要删除吗”进行追问。所以rm -rf等于“一路往里删不给我任何犹豫的机会”。初学者的第一课不应该是“学会用 rm -rf”而应该是“学会让自己少用 rm -rf”。我现在的习惯是能不删就不删先移动。不确定这个文件还有没有用就mv 文件名 /tmp/丢进临时目录放着过几天确定没用了再清空。养成用rm -i的习惯。-i是交互模式删除前逐个问“是否确认”等于给手滑加一道刹车。删除前先ls看一遍。尤其是删目录前先列出里面的内容确认这不是你花了两小时配好的配置文件。另外还有一个细节删除目录时用rmdir只能删空目录目录里有任何文件都会报错。它看起来又蠢又麻烦但恰恰是这种“麻烦”逼着你先想清楚目录里有什么也算一种保护机制。真正批量删除的时候我建议在脚本里加一个判断逻辑比如先打印要删的文件列表人工扫一眼再执行。2.2 文件重命名为什么偏偏用mv在 Windows 上重命名文件右键——“重命名”就行了。但在 Linux 的终端里熟悉的名字却是mv全称move移动。一开始我特别不理解重命名跟移动有什么关系直到我意识到一个关键点在 Linux 的视角里重命名其实就是把文件从一个“路径名”移动到另一个“路径名”。你移动一个文件到别的目录可以mv 文件 目标目录/你只是改个名字不换地方也还是mv 旧文件名 新文件名。本质上路径和文件名是统一的“改名”只是“移动到同目录下的新名字”而已。这个认知帮我绕开了一个小坑如果你想把文件从a.txt改成a.log正确写法是mv a.txt a.log而很多新手包括我会下意识去找所谓的“rename命令”。实际系统里确实有一个rename命令但它默认是按照 Perl 正则表达式来匹配文件名语法复杂而且不同发行版的实现还不一样初学者拿它做简单改名反而容易把自己绕晕。所以我的建议是单个或少量文件改名老老实实用mv真正遇到批量改名需求写一个 for 循环脚本调用mv就好。我举个真实场景我有一批照片名字是IMG_0001.jpg这种想统一在前面加上日期前缀。用循环实现很简单for f in IMG_*.jpg; do mv $f 20250101_$f done核心就是利用for f in 通配符把每个文件名取出来再在mv的目标里拼接新名字。变量用引号包住是为了防止文件名里有空格导致命令被拆开——这个细节我是在文件名带空格被mv狠狠教训一次之后才记住的。2.3 新建用户useradd和adduser的差别你最好搞清楚“linux新建用户”这个搜索词的热度从来不低但教程的写法五花八门有的说useradd有的说adduser让人摸不着头脑。我最初也以为这俩是同一个命令的两种写法直到在云服务器上输错之后才认真查了两者的区别。简单说useradd是系统原生的底层工具参数很灵活但默认“什么都没给你”——它不会自动创建家目录也不会给你设置默认 shell 和密码。你执行useradd zhangsan之后系统里确实多了这个用户但这个用户登录后可能连/home/zhangsan都没有shell 还是/bin/sh连密码都是锁定状态。adduser是一个更友好的封装脚本基于useradd但会帮你完成一系列初始化创建家目录、设置密码、复制默认配置文件、设置 shell 等。在 Ubuntu/Debian 系里面你新建一个普通用户直接用adduser zhangsan交互式完成即可。如果你已经用useradd把用户建出来了发现没有家目录补救方式也不复杂mkdir -p /home/zhangsan chown zhangsan:zhangsan /home/zhangsan usermod -d /home/zhangsan zhangsan chsh -s /bin/bash zhangsan # 把默认shell改为bash passwd zhangsan # 设置/解锁密码这一套操作组合下来就是adduser在背后帮你做的事只不过它把过程自动化了。我自己的建议很简单能用adduser就别用useradd等以后真到了写脚本批量建用户的场景再回头研究useradd的参数不迟。2.4 查看系统时间与时间同步只会date和时钟不准是两回事“linux查看系统时间同步时间”这个热搜词我猜很多人跟我一样一开始只是想看看现在几点于是学了date。但后来注意到服务器时间总是跟手机时间差半分钟、甚至越走越偏才意识到“看到当前时间”和“系统时间是正确的”完全是两码事。在 Linux 系统上查看时间的基本命令是date输出类似2025年 01月 02日 星期四 15:04:05 CST一看就知道当前系统时间。但如果你想知道“系统的时钟是怎么校对的”就得使用timedatectl。这个命令能告诉我们系统是否启用了 NTP 时间同步、当前时区是什么、有没有正在运行的时间同步服务。如果发现 NTP 服务没开最简单的开启方式是timedatectl set-ntp true不过timedatectl set-ntp true仅仅是让系统自己去 NTP 服务器同步不保证一定会立刻同步成功。如果你发现时间还是偏就先执行timedatectl status查看服务状态再考虑重启systemd-timesyncd服务或者临时用ntpdate手拉一次时间。这里要提醒一下很多云服务器上默认的时间同步服务并不是同一个有的是 chrony有的是 systemd-timesyncd不要只看一个命令就认定系统没在同步时间先ps -ef | grep -E chrony|systemd-timesyncd看看后台到底跑着哪个服务再对症下药。3. 折腾环境是Linux入门最快的路装Python、装GCC、装输入法3.1 先搞懂“软件源”这个仓库逻辑在 Linux 上装软件最常见的命令是apt install xxx或dnf install xxx。初学者往往只知道“装软件用这个命令”却不知道为什么执行apt install python3几十秒钟就装好了而打开浏览器去官网下载 tar 包反而要折腾半天。这里面的关键就是“软件源”repository国内社区常把它叫“源”。源就是一批官方或社区维护好的软件仓库你的包管理器只是告诉系统“请从源里把那个软件拉下来并安装好”。当你执行apt update的时候其实是在更新本地记录的“仓库目录”也就是让系统知道源里有哪些软件的哪个版本apt install才是真正按目录去下载并安装。如果你跳过apt update直接装经常会提示“找不到包”因为系统本地记录的源列表太旧了还不知道有这个东西。我建议初学者在“折腾环境”之前先学会查看当前系统用的是什么包管理器以及源配置文件在哪里。以 Ubuntu/Debian 为例源配置通常在/etc/apt/sources.list或者/etc/apt/sources.list.d/下的文件里。先把apt update跑通后面装东西就能省掉大部分烦恼。如果不想手动追版本可以把“装什么软件”交给包管理器把“玩新版本”的需求放到 Docker 或虚拟机里而不是直接改源装激进版本否则依赖很容易崩塌。3.2 装Python时最容易卡住的版本和“符号链接”问题“linux系统安装python”这个热搜词下面挤满了各种教程有说apt install python3的有说去官网下源码编译的还有说装 Anaconda 的。作为一个已经在这个坑里滚过一圈的人我给出自己现在的判断标准只是想跑 Python 脚本系统自带的 Python 版本够用就用包管理器装最省心。需要特定版本比如项目要求 Python 3.10而系统源里只有 3.8优先考虑装 Anaconda/Miniconda 这类环境管理器而不是直接去编译源码。真的到了必须源码编译的场景比如某些嵌入式交叉编译环境再老老实实./configure make make install。装 Python 最让人头疼的其实不是安装过程本身而是装完之后你发现python命令还是指向了旧版本。这背后是一个叫“符号链接”symbolic link简称 symlink的概念。Linux 下的/usr/bin/python3可能只是一个指向/usr/bin/python3.8的链接你装了 Python 3.10它并不会自动让python3指向 3.10。如果你希望系统默认使用新版本可以用update-alternatives来管理比较稳妥的注册方式如下sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.10 2 sudo update-alternatives --config python3但我必须提醒一句不要为了让python3指向新版本直接把/usr/bin/python3这个符号链接改成别的路径。很多系统组件比如apt本身深度依赖系统自带 Python你把它换成新版本轻则让某些工具莫名其妙报错重则把系统包管理器直接搞坏。我之前就干过“手软”改链接结果apt疯狂报 Unicode 错误折腾了半天只好恢复原链接。3.3 GCC编译器的安装与“找不到头文件”的尴尬“linux下载gcc编译器”这个话题估计很多人的第一反应是去官网下 GCC 源码然后编译。但说真的在没有特殊需求的情况下直接用包管理器装才是正解# Ubuntu/Debian 系 sudo apt install build-essential # 装完后验证 gcc --versionbuild-essential这个包很有意思它不是一个软件而是一组软件的组合GCC、G、make 和一系列编译必需的头文件。很多人遇到“装了个 gcc但编译 hello.c 时报错stdio.h 找不到”大概率就是因为只装了gcc没装build-essential导致/usr/include/stdio.h根本不存在。这个坑特别迷惑人因为你去查“GCC 没装好”的教程很少会提到“别只装 gcc要装 build-essential”。另一个常见问题是gcc和g的关系。二者都是 GNU 编译器套件的一部分区别在于gcc侧重 C 语言g侧重 C而很多新手编译.c文件时下意识敲g结果报 “无法识别文件类型” 或链接错误。记住一条朴素的规则.c文件用gcc.cpp文件用g链接 C 项目时用g比用gcc少踩很多坑。3.4 桌面环境下装个输入法都能让我学到系统启动脚本如果你跟我一样喜欢在 Linux 桌面上办公那么“linux安装搜狗输入法命令”这种搜索词早晚会遇到。输入法在 Linux 桌面环境里不是“装个软件就行”这么简单它需要和输入法框架fcitx 或 ibus配合还要设置环境变量GTK_IM_MODULE、QT_IM_MODULE、XMODIFIERS否则你在编辑器里怎么切换都切不到中文。我自己的踩坑经历是装好输入法和 fcitx 框架之后重启系统发现输入法又不见了。检查一圈才发现桌面会话里需要设置环境变量。很多教程会告诉你“在/etc/profile里加 export”但说实话我后来发现自己常用的启动方式更依赖用户级配置文件比如~/.xprofile里加export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx然后重新登录桌面环境才生效。这个问题的本质不是输入法软件难装而是它涉及到了桌面环境、会话启动脚本、环境变量三层配合。对于初学者遇到这类“装完不生效”的问题先别急着卸载重装先看看是不是缺了设置步骤反而更能学到东西。4. 虚拟机与镜像不敢直接装双系统时的大本营4.1 为什么初学者最好先在虚拟机里折腾直接给电脑装 Linux 双系统最大的障碍不是技术而是怕“把 Windows 搞没了”。我当初的心理压力就很大万一装坏了怎么办工作资料还在里面呢。后来我转向了虚拟机方案发现这几乎是初学者的完美练习场。虚拟机的核心价值在于快照snapshot。你可以把刚装好、配置干净的系统存成一个快照然后随便折腾——删系统文件、乱改配置、装各种环境折腾坏了直接恢复到快照即可。这相当于给电脑买了一份“后悔药”对于培养折腾的胆量至关重要。另一个好处是网络和硬件隔离。虚拟机里的系统是通过虚拟网卡访问网络的你无需担心把主机的网络配置搞乱虚拟硬盘也是一个大文件如 vmdk、qcow2 格式不喜欢了删除文件就行一点都不影响物理磁盘的分区表。4.2 镜像下载与校验这一步省了早晚会后悔新手在“linux镜像安装”这个话题下最常见的操作失误是随便在一个不熟悉的网站下载了镜像然后安装到一半发现文件损坏或者被植入东西。我的建议永远不会变官网下载优先。Ubuntu、Debian、CentOS Stream 等主流发行版都在官网提供 iso 镜像的下载链接不要贪快去找第三方整理站。下载后校验 SHA256 校验和。校验是初学者特别容易忽略的一步。Linux 系统自带sha256sum命令你可以把下载的镜像文件放进去跑一下sha256sum ubuntu-24.04-desktop-amd64.iso然后把输出的一长串十六进制数字和官网给出的校验值对比。如果一样说明文件完整没被篡改如果不一样就得重新下载。别小看这几十秒钟它能帮你省掉安装过程中各种“卡住”“报错”“引导不起来”的疑难杂症。4.3 虚拟机里装系统常见的三个奇怪问题我在虚拟机里装 Linux 时遇到过三个特别典型的问题估计不少人都碰到过我直接说一说对应的排查思路。第一个问题安装时蓝屏或直接卡死在启动界面。这种情况在 Windows 上装虚拟化软件时尤其常见。先检查你的电脑 CPU 是否开启了虚拟化功能Intel VT-x / AMD-V在 BIOS/UEFI 里找找 “Intel Virtualization Technology” 或 “SVM Mode” 之类的选项开启了再启动虚拟机。其次检查虚拟机的配置内存至少给 2GB否则图形安装界面很容易卡死。第二个问题装完系统之后分辨率特别小窗口拉伸也不起作用。这通常是没装“增强功能”或“Guest Additions”。VirtualBox 里叫“安装增强功能”VMware 里叫“VMware Tools”。它的作用不仅仅是让窗口自适应还负责共享剪贴板、拖拽文件、显卡驱动等。初学者第一步就把它装上省掉后面百分之八十的“钝拙感”。第三个问题共享剪贴板失效。很多人以为自己装好增强功能就能从 Windows 复制一段命令到 Linux 里粘贴实际上还必须打开“设备”菜单里的“共享剪贴板”选项并设置成“双向”。而且增强功能驱动在 Linux 内核更新后可能会失效需要重新安装这是正常现象不是系统坏了。5. Shell脚本与进程管理从“记住命令”到“让系统自己干活”5.1 第一个脚本批量重命名背后的循环思维初学者学习 shell 脚本最大的障碍是“不知道脚本能干什么也不知道从哪开始”。我自己的第一个脚本是为了批量重命名文件前面已经提到了。但脚本的价值远不止改名它真正让人上瘾的是循环和判断的组合。举一个我实际写过的例子系统里有一批日志文件格式是app-20250101.log、app-20250102.log这样的我想删掉 7 天以前的日志。手写一个个删除太蠢于是写了一个脚本#!/bin/bash log_dir/var/log/myapp days7 find $log_dir -name app-*.log -mtime $days -delete这个脚本用了find命令的-mtime 7条件意思是“找到最后修改时间超过 7 天的文件”然后-delete删除。表面上看只是把一堆参数拼在一起实际上背后是一整套逻辑指出范围、定义条件、执行动作。写脚本的核心思维就是把“我要干什么”翻译成“系统能一步步执行的指令”。如果你问我初学者第一个脚本应该写什么我会推荐这三个方向里挑一个批量重命名文件、批量创建多个目录、批量下载某个列表里的网址。它们都能用最简单的for循环覆盖for i in {1..10}; do mkdir dir_$i done这个脚本会在当前目录下创建dir_1到dir_10十个文件夹。就这么简单但它已经能让你理解循环、变量和命令执行结果这三个 shell 脚本的底层概念了。5.2 后台运行nohup、、systemd的取舍“linux 让后台运行指令 不因界面退出而退出”这个热搜词描述得特别形象。初学者会遇到的一个经典场景是在终端里启动了一个服务终端一关服务也跟着断掉。这是因为大多数进程由终端启动后会收到一个挂断信号SIGHUP默认行为是直接终止。解决方案有几个层级最简单的是用。命令后面加一个表示把它放到后台。比如python3 app.py 。但注意只是让进程不阻塞当前终端你退出终端时它依然可能被 SIGHUP 杀掉。用nohup加上。nohup的作用就是忽略挂断信号所以经典组合是nohup python3 app.py output.log 21 。这里的 output.log是把标准输出重定向到日志文件21是把错误输出也一并放进去。这条命令组合相当于告诉系统这个进程要活着即使你的终端窗口关了。比较正规的是把进程交给 systemd 管理。用systemd的 service 单元文件来托管进程好处是开机自启、崩溃自动重启、日志统一收集。这个方案需要用systemctl管理写.service文件门槛稍微高一点但它是服务器上跑服务的“标准答案”。作为初学者你可以先用nohup解决“终端关了服务就挂”的问题等哪天发现服务掉了没人管再升级到 systemd 方案也不迟。直接上 systemd 反而容易因为不熟悉概念而觉得 Linux 太难。5.3 进程间通信入门管道其实已经算一种了“linux进程间通信”这个话题初学者一搜可能会被吓到——共享内存、消息队列、信号量全是偏底层的名词。但我想说的是你在终端里写的那个竖线|其实就已经在用一种最简单的进程间通信方式了。比如ls -l | grep txt这行命令的含义是让ls -l输出文件列表通过管道把输出作为grep txt的输入。这里面的“管道”正是一种让进程之间传递数据的方式只不过系统帮你把“连接”建好了。理解这一点后进程间通信就没有那么抽象了进程 A 把结果写到一个约定好的地方进程 B 从这个地方读出来关键在于“约定好”三个字。管道就是约定“前一个命令的输出给后一个命令做输入”重定向和则是约定“输出写到文件”和“从文件读取输入”。初学者不需要一上来就啃共享内存和信号量先把管道和重定向用熟你就已经踏入进程间通信的大门了。6. 故障排查那些让我差点重装系统的瞬间6.1 手滑删错文件的教训最好的“修复”是预防我在 Linux 上栽过最狠的一次跟rm有关。当时想删除某个项目目录下的临时文件夹因为路径比较长我在命令里复制粘贴了一段路径结果少复制了一个字符命令变成了删除上级目录的一大堆文件。等反应过来终端已经输出了几十行删除信息我当时心都凉了半截。那次事故让我学到两个教训写长路径的删除命令绝对不要闷头直接回车。先echo 要删除的路径确认路径写在纸面上是对的再执行rm。多花两秒钟能避免几小时的痛苦。重要目录要做备份或使用快照。虚拟机可以用快照物理机可以定期用rsync备份关键数据。对初学者来说永远要有一个“最坏情况方案”。网上那些“linux运维故障案例”里删错文件、改错权限、看清配置就重启服务的案例排在前面不是没有原因的。很多事故真正的问题不是命令不会用而是“执行的时候少了一道确认”。6.2 日志排查思路先看这个再做决定系统出问题时我的第一反应曾经是打开浏览器搜索“xxx问题解决方法”但后来我发现更有效的路径是先看系统自己说了什么。Linux 系统几乎所有的服务和操作都会留下日志常见的日志位置有/var/log/messages、/var/log/syslog使用 systemd 的发行版则用journalctl统一查看。举个例子我遇到过一次网络不通的问题终端里ping外网一直失败。我没有急着去重新配置网络而是执行journalctl -u systemd-networkd --since 10 minutes ago日志里直接写着“Failed to set link: Operation not supported”。顺着这条信息搜才发现是虚拟网卡驱动和内核模块版本不匹配。如果没有查日志我可能会把网卡配置文件改来改去折腾一整天。给初学者的建议是故障排查先看三样东西再动手——报错原文、系统日志、最近改了什么配置。而不是一上来就重装系统。很多时候“重装大法”虽然能解除眼前的痛苦但你会错过学习“定位问题”的机会下次遇到同样的问题还是不知所措。6.3 我的“别乱动”清单给同样手痒的人踩过不少坑之后我给自己总结了一份“别乱动”清单现在分享出来虽然不能帮你避免所有问题但至少能挡住一大半麻烦不要在 root 用户下乱敲命令尤其是删除和权限相关的命令。需要管理员权限的时候用sudo并且只加在当前这一条命令上不要因为怕麻烦直接sudo su切到 root 然后忘切回来。不要随便对整个目录执行chmod 777。很多人遇到权限报错第一反应是 “是不是权限不够那就全开权限”这在入门阶段确实能解决一些问题但埋下的隐患安全问题、目录权限异常往往更糟糕。不要改完配置文件后长期不重启服务。改完配置记得用systemctl restart 服务名或者按对应方式重启否则你后面排查问题时可能忘掉配置其实还没生效。不要在重要操作前不做快照/备份。虚拟机里装系统、物理机上动分区、修改系统核心配置这些操作前至少要有一种回滚方案。这份清单不是教你别折腾而是教你别“白折腾”。有后悔药的时候随便试错没有后悔药的时候多花一点时间准备这才是一个 Linux 初学者应该有的状态。最后的最后我想说一个这段时间体会最深的事情学 Linux 最容易让人灰心的不是“它很难”而是“教程里那些操作你跟着做了却不知道为什么这样做”。如果你也在学试着把手边的任务拆成“我要完成什么目标系统允许我怎么做报错在告诉我什么”三个问题你会发现之前那些记不住的知识点其实都是这三问的答案。折腾系统这件事慢一点不打紧怕的是停下来不碰了。