简介:《Unix/Linux基础讲义》以单份 doc 文档形式呈现,定位为操作系统入门的课堂讲义式材料,适合刚接触命令行与服务器环境的初学者,也适合需要补齐概念的备考或转行读者。内容从操作系统“方便、有效、扩展”三项目标讲起,说明其向下封装硬件、向上提供操作接口的承上启下地位,再沿 Unix 与 Linux 两条家族脉络梳理关键节点:MULTICS 计划、1969 年 UNICS 的诞生、用 C 语言重写、BSD 与 System Ⅲ 的分化,以及 Minix、Linus 内核、GNU 计划、POSIX 标准与互联网这五根支柱。讲义还展开 Linux 内核与发行版、X Window 的客户机/服务器结构、服务器与嵌入式等应用领域,并附发行版排名表格,章节按 1.1、1.2 编号组织,条目清晰,便于按节检索或当作复习提纲。压缩包内共 1 个 doc 文件,约 13.46MB,已有 325 人学习。
1. 一句话讲清 Unix/Linux:为什么这两个名字总被放在一起
很多人第一次看到「Unix/Linux」这种写法,会以为它是一个软件的名字,或者以为 Unix 是个品牌、Linux 是它的新版本。更准确的理解是:它是一大家子操作系统的统称,就像「燃油车」不是一个车型,而是指一整类交通工具。
通俗地说,Unix 是上世纪六十年代末诞生的一类多用户、多任务操作系统的老祖宗,Linux 则是九十年代初重新写出来、但长相和脾气都跟 Unix 很像的一个「类 Unix」系统。两者不是同一个东西,却共用同一套设计思路:单一根目录树、一切皆文件、靠命令说话、多用户分权限。讲义之所以把它们放进同一个标题,就是因为学会其中一套,另一套基本能直接上手。先抓住这条主线,后面那些目录、路径和命令才不会是零散的知识点。
2. 操作系统这层夹心:Unix/Linux 到底在计算机里管什么
2.1 三个目标:方便、有效、可扩展
一台电脑摆在你面前,真正能直接被你感知的其实只有两样东西:屏幕和键盘。中间那层被藏起来的,才是操作系统在干的活。讲义把操作系统的目标归纳成三条:方便、有效、可扩展。
方便,是让计算机系统易于使用。主板、内存条、硬盘,本质上都是靠电信号说话的东西;操作系统把这些细节包起来,换成「文件」「目录」「进程」这类人能理解的词,你敲一条命令,它替你换算成底层动作。有效,是以更有效的方式使用计算机系统资源。机器最怕闲着——CPU 在等你敲键盘的那零点几秒里,操作系统会把它切给别的任务去跑;内存什么时候分配、什么时候回收,磁盘按什么块读写,谁来排队谁先执行,都是它在调度。可扩展,是方便用户有效开发、测试和引进新功能。新硬件插上来,只要驱动按接口写好,系统本身不必大改;新程序装上去,不用重新编译整个系统。
这三条听着抽象,但拿它当尺子很好用:判断一个系统好不好上手、资源浪不浪费、加新东西麻不麻烦,对的就是这三项。后面要讲的多用户、多任务、目录结构、权限控制,骨子里都是为了让这三条站得住。
2.2 承上启下:向下封装硬件,向上提供接口
讲义里有一句话信息量很大:操作系统在计算机系统中处于承上启下的地位,向下封装硬件,向上提供操作接口。这句话几乎能解释 Linux 的所有设计怪癖。
打个比方,操作系统像一家酒店的中间管理层。住客(应用程序)只需要说「我要一间朝南的房」,不需要知道锅炉怎么烧、水管怎么走;工程部(硬件)只需要按规程维护设备,不需要应付每一位住客的临时要求。中间这层要是撤了,住客得自己去拧阀门,工程部得挨个回答住客问题,两边都乱套。
落到具体动作上就更好懂了。你在程序里做一次「写文件」,应用程序看到的只是三个动作:打开、写入、关闭。
// 应用程序眼里的世界:打开、写、关闭,仅此而已 FILE *fp = fopen("/tmp/demo.txt", "w"); // 中间层负责解析路径、检查权限、定位 inode if (fp == NULL) { return -1; // 打不开时返回空指针,通常是路径不存在或没有写权限 } fputs("hello", fp); // 先写进内存缓冲区,还没真正落盘 fclose(fp); // 触发缓冲区刷新,数据这时才交给块设备驱动这三行背后,操作系统替你做了三件你根本没意识到的事:fopen要把/tmp/demo.txt这段路径逐级解析成真实的存储位置,顺带检查当前用户有没有写权限;fputs的数据先进内存缓冲区,攒够一批再往下发,避免每写一个字节就惊动一次磁盘;fclose才真正把缓冲刷出去,交给块设备驱动去决定写到哪一块。参数"w"的意思是「写模式打开,不存在就创建,存在就清空」,换成"a"就是追加,换成"r"就只能读,没有写权限会直接失败。
这一层抽象的价值在换硬件的时候最明显。机械硬盘换成固态硬盘,驱动程序换掉,上面这一整段代码一个字都不用改。这也正是 Unix 能活到今天、Linux 能跑到各种奇形怪状设备上的根本原因——接口稳定,底层随便换。
2.3 多用户、多任务、实时:三个容易被念错的属性
讲义用三个词概括 Unix 的性格:多用户、多任务、实时。这三个词经常被人一口气念完却不知道在说什么,拆开看其实很朴素。
多用户,指的是一台机器可以同时服务多个登录的用户。注意是「同时」而不是「轮流」——张三在跑编译,李四在查日志,王五在传文件,三个人各有各的账号、各有各的家目录、各有各的权限边界,互相看不见对方不该看的东西。这一条直接催生了后面要讲的权限体系:既然有这么多人挤在一台机器上,就必须回答「这个文件归谁、谁能读、谁能改」。
多任务,指的是操作系统能在多个程序之间快速切换,让它们看起来在同时运行。切得够快,人眼就感觉不到;但切换本身有成本,所以调度策略很重要——谁先跑、跑多久、什么时候让出 CPU,都是学问。
至于「实时」,讲义里的用法更接近「响应及时、交互即时」的意思,说的是敲下命令马上有反应,不是那种毫秒级、有严格上限保证的硬实时系统。工程上如果讨论刹车控制、飞行控制这类场景,判定标准完全是另一套,两者不要混着用。
这三个属性凑在一起,才有了后面所有的设计:多用户要求权限,多任务要求进程管理,而这两者的信息最终都要落在文件系统上——这就引出了下一章要讲的家族史,以及再往后的目录树。
3. Unix 与 Linux 的血缘:一条线怎么分成两支
3.1 Unix 的诞生:从一个失败的大项目说起
Unix 的起点其实是个失败案例。1965 年,一家大型工业实验室拉上一家电气公司和某高校,合伙要做一个多使用者、多任务、多层次的庞大系统。目标定得很高,复杂度也定得很高,最后项目撑不住,黄了。
但参与这个项目的人不甘心。1969 年,两位核心开发者带着一组人,决定不搞那么大的摊子,重新做一个更小的多任务系统,最初叫 UNICS,后来改名为 Unix。最早的 Unix 是用 B 语言和汇编语言混着写的——之所以混着写,是因为当时没有更趁手的工具。1971 年,C 语言被发明出来;1973 年,整个 Unix 用 C 语言重写了一遍。这一步的意义怎么强调都不过分:一个操作系统第一次能用高级语言写,意味着它可以被移植到别的机器上,而不必为每台机器重写一遍。
1974 年,Unix 第一次走出实验室,被外界看到。此后政府机关、研究机构、企业和高校纷纷注意到它,逐渐流行开来。到 1980 年,市面上出现了两条最主要的版本线:一条是某高校主导的 BSD 分支,另一条是原实验室的商业版本线。两条线互相竞争,最终引发了一场持续多年的「Unix 战争」,直接后果是 Unix 出现了各种各样的变种——各家改各家的,接口越来越不统一。
1982 年,商业版本不再开源。1992 到 2001 年,一场将近十年的版权官司把两条线都拖住了:Unix 因为费用昂贵,长期只能待在大型机上,普通用户可望而不可及;BSD 分支则因为版权纠纷,失去了宝贵的发展窗口期。这段历史留下了一个巨大的空档——市场需要一套便宜、开放、又跟 Unix 长得像的系统。Linux 就是从这个空档里长出来的。
3.2 Linux 的五个支柱:不是凭空冒出来的
很多人以为 Linux 是横空出世,其实讲义把它的成长拆成了五个支柱:Unix 操作系统、一款教学用的迷你类 Unix 系统、一个自由软件计划、POSIX 标准,以及互联网。五根柱子缺一根,Linux 都不会是今天这个样子。
先看那个教学系统。一位大学教授为了讲操作系统课,仿照 BSD 的源码,白手起家写了大约 12000 行 C 代码,做出了一个迷你类 Unix 系统。它本身只是个教学工具,没什么实际应用价值,但它证明了「一个人也能写出一个能跑的系统」。1990 年,一位年轻开发者决定在这个教学系统的基础上写一个自己的内核,最初的名字里还带着原系统的影子,后来改名为 Linux,1991 年正式发布,逐渐引起注意。
第二根柱子是那个自由软件计划。1984 年,一位资深程序员发起了一个目标很明确的项目:开发一套免费、类 Unix 的操作系统和配套开发工具。今天大家天天在用的编辑器、BASH shell 程序、GCC 编译器、GDB 调试器,都是这个计划的产物。缺了这批工具,光有一个内核也干不了活。
第三根柱子是 POSIX 标准。它定义了操作系统应该为应用程序提供什么样的接口,作用是把 Unix、Linux 各个分支的编程接口统一起来,提高通用性和可移植性。举个直白的例子:如果没有这套标准,同一段代码在这个分支能编译、换个分支就报错;有了它,只要接口对齐,代码搬来搬去基本不用改。
第四是互联网。全世界的修改最终会汇总到同一个地方,由开源社区甄别、修改、决定是否进入主线内核。1992 年,Linux 和其他自由软件结合,一个完全自由的操作系统正式诞生,通常被称为 GNU/Linux,或者干脆简称 Linux。这也就是为什么严格来说「Linux」只是内核的名字,而我们日常说的「装个 Linux」其实装的是整套组合。
3.3 内核与发行版:心脏和整车的关系
讲义里有个比喻很到位:内核是系统的心脏。它是运行程序和管理磁盘、打印机这类硬件设备的核心程序,提供了一个在裸设备和应用程序之间的抽象层。裸设备就是没有经过任何包装的硬件,应用程序直接跟它打交道几乎不可能,中间必须垫上这一层。
内核版本分两种:稳定版和开发版,两者相互关联、相互循环。稳定版具有工业级强度,可以广泛地应用和部署,新的稳定版相对旧版主要就是修 bug 或者加一些新驱动;开发版则因为要试验各种解决方案,变化很快。全世界的修改最终都会汇总到内核源码站,由社区甄别之后决定是否进入主线。这句话值得多想一秒——它意味着内核不是一家公司说了算,而是一个有准入机制的公共资产。
那发行版又是什么?发行版通常包含内核、大量来自自由软件计划的函数库,以及基于 X Window 的图形界面,外面再套一层桌面环境、办公套件、媒体播放器、数据库这些应用软件。用车的比喻:内核是发动机,发行版是整车——同样一台发动机,可以装成家用轿车,也可以装成货车,配置单不一样,开起来的感觉也不一样。
这里有个常被忽略的点:X Window 系统是客户机/服务器结构的,实现上和操作系统内核是分开的,主要由 X Server 和 X Client 两部分组成,而且它并不是 Unix/Linux 的必需构成部分,只是一个可选的应用程序组件。换句话说,桌面再花哨,也只是外衣;无论哪个发行版,桌面和应用是外衣,文件组织和目录结构才是内核之外的真正骨架。记这句话,能省掉后面很多迷糊。
4. 目录、路径与权限:Linux 的「地址系统」和「门禁系统」
4.1 单一根目录树:为什么 Linux 里没有 C 盘
从 Windows 转过来的人,第一个不适应就是找不到盘符。在 Windows 里打开「计算机」,看到的是一排驱动器图标:C 盘、D 盘、E 盘,每个驱动器都有自己的根目录结构,形成多棵树并列的局面。
Unix/Linux 完全不是这个思路。它不使用驱动器这个概念,而是使用单一的根目录结构:所有的分区都挂载到唯一的「/」目录上,最终组成一棵树。你插入一块新硬盘,不是多出一个「F 盘」,而是在树上找个位置把它挂上去,从此那个位置下面的内容就来自这块硬盘。对上层来说,路径长什么样完全不变,只是路径的尽头换了一块物理设备。
这个统一来得并不容易。早期的 Unix 系统里,各家厂商各自定义自己的目录,同一个东西在 A 家叫这个名,在 B 家叫那个名,非常混乱。1994 年,业界对根文件目录做了统一规范,推出 FHS(Filesystem Hierarchy Standard,文件系统层次结构标准),规定了根目录下各文件夹的名称及作用,才把命名混乱的局面收拾干净。这也解释了一个现象:不管你装哪个发行版,/etc永远是配置、/home永远是用户家目录——标准在那里摆着。
4.2 绝对路径与相对路径:. 和 .. 到底是谁
路径的作用是定位。Unix/Linux 的路径由到达目标文件的各级目录组成,分隔符是斜杠/,这一点和 DOS 用反斜杠\正好相反。刚上手时最容易翻车的地方,就是把 Windows 的习惯带过来,敲出一串反斜杠。
路径分两种。绝对路径从目录树的树根/开始,往下直到文件所经过的所有节点目录,下级目录接在上级目录后面用/隔开。因为起点固定是/,所以绝对路径的第一个字符一定是/,不管你在哪个目录下执行,它都指向同一个位置。相对路径则是指目标目录相对于当前目录的位置,起点是「你现在在哪」。
相对路径里有两个特殊目录项必须认识:.指向当前目录本身,..指向上一级目录。几乎每个目录文件里都至少包含这两条,它们是目录结构能自我描述的基础。
cd /home/demo/projects # 绝对路径:从根 / 出发,在哪个目录下执行结果都一样 cd ../logs # 相对路径:.. 是上一级,所以先退回 projects 的父目录,再进 logs cd . # . 是当前目录,看着像没动,脚本里常用来明确指向"就在这里" ls ../../etc # 可以连着用:上两级,再进 etc这三条命令演示了同一个动作的三种写法。cd /home/demo/projects里的/home/demo/projects是从根一路写下来的完整链条;cd ../logs依赖你当前所处的位置,站在别处执行就会跑到别的地方去,这是相对路径最需要注意的地方;cd .看起来毫无意义,但在脚本里写./run.sh这种形式时,.明确告诉系统「就在当前目录找,别去 PATH 里搜」,能避免不少意外。
4.3 FHS 目录速查:每个文件夹管什么
理解了单根树,接下来就是认路。下面这张表按讲义整理,是日常最常打交道的十几个目录,建议先混个脸熟,不用背。
| 目录 | 存放内容 | 典型例子 |
|---|---|---|
/ | 根目录,有且只有一个,所有东西从这里开始 | /home、/etc都挂在它下面 |
/bin、/usr/bin | 可执行二进制文件 | ls、tar、mv、cat |
/boot | 系统启动时用到的文件 | 内核文件、系统引导管理器 |
/dev | 设备文件,访问文件等于访问设备 | 光驱挂载mount /dev/cdrom /mnt |
/etc | 系统配置文件,不建议放可执行文件 | 启动配置、挂载表、服务配置、图形界面配置 |
/home | 普通用户家目录,新增账号时建在这里 | ~是当前用户家目录,~edu是 edu 的家目录 |
/lib、/usr/lib、/usr/local/lib | 系统使用的函数库 | 程序运行时需要调用的额外库 |
/lost+found | 系统异常时产生的遗失片段 | 断电或崩溃后可能出现 |
/mnt、/media | 挂载点 | 光盘通常挂在/mnt/cdrom,也可以挂到任意位置 |
/opt | 给主机额外安装软件的目录 | 第三方大型软件 |
/proc | 数据都在内存里,不占磁盘 | cpuinfo、interrupts、net等 |
/root | 管理员的家目录 | 和/home下的普通用户家目录区分开 |
/sbin、/usr/sbin、/usr/local/sbin | 管理员使用的可执行命令 | fdisk、shutdown、mount |
/tmp | 临时文件,任何人都能访问 | 重要数据不要放这里 |
/srv | 服务启动后需要访问的数据 | 网站数据常放/srv/www |
/usr | 应用程序存放目录 | /usr/bin放程序,/usr/share放共享数据,/usr/share/doc放说明文档,/usr/share/man放手册 |
/var | 执行过程中经常变化的文件 | /var/log日志,/var/spool/mail邮件,/var/run进程号 |
表里有两组容易记混的对照,值得单独点出来。第一组是/bin和/sbin:前者是所有用户都能用的命令,后者是给管理员用的,普通用户一般只能查看、不能随便设置和使用。第二组是/usr和/var:前者放的是「装进去就不怎么变」的程序和数据,后者放的是「一直在变」的日志、邮件、进程号。至于/tmp,它谁都能访问、谁都能写,所以任何要紧的东西都不该往里放。
4.4 三类人三组权限:那一串 rwx 怎么读
多用户系统里,光有地址不够,还得有门禁。文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件以及可以执行什么样的操作。Unix/Linux 除了对用户权限做严格界定,还在用户身份认证、访问控制、传输安全、文件读写权限等方面做了周密控制。
先看「人」怎么分类,讲义用 QQ 空间的例子把这事说透了:这个空间是我的,我相当于管理者,也就是所有者;我可以设置允许好友访问,好友类似于用户组;我也可以放开给所有人,所有人就类似于其他用户。三类访问者,对应三种授权。所有者就是创建文件的用户,可以允许所在用户组访问;用户组是一批被归在一起的用户,比如同一个项目里的人都归到一个组;其他用户就是系统里剩下的所有人。
再看「权限」怎么分,三档:读、写、执行。关键在于,同一档权限对文件和目录的意思不一样。
| 权限 | 对文件 | 对目录 |
|---|---|---|
读r | 读取文件内容 | 浏览目录,能列出里面有什么 |
写w | 新增、修改文件内容 | 删除、移动目录内的文件 |
执行x | 执行这个文件 | 进入这个目录 |
这组差别是初学阶段最大的坑:目录的「写」不是改目录本身,而是往目录里增删条目;目录的「执行」才是能不能进去,没有它,cd都进不去,哪怕你有读权限也只能看见名字。
落到显示上,ls -l输出的第一列那串字符,就是权限的全部信息。第一个字母代表文件类型:d是文件夹,-是普通文件,c是字符设备,b是块设备,s是管道文件,l是软链接。后面九个字母,三个一组,依次是所有者、用户组、其他用户的权限。
ls -l /tmp/demo.txt # -rw-r--r-- 1 demo demo 128 Oct 1 10:00 /tmp/demo.txt # │└┬┘└┬┘└┬┘ # │ │ │ └── 其他用户:只有 r,能读不能改不能执行 # │ │ └───── 用户组:只有 r,同样只读 # │ └──────── 所有者:rw-,能读能写,但没有 x,不是可执行程序 # └────────── 文件类型:- 表示这是一个普通文件读这串字符有个小顺序:先看第一个字母判断类型,再把后九个切成三段,每段内部固定是「读、写、执行」的顺序,没有哪一项就显示-。上面这个例子就是「所有者可读写、同组只读、其他人只读」的典型配置,也是新建普通文件最常见的默认值。另外有一条边界要知道:通常只有文件的所有者或超级用户才能改读写权限,别人改不了——所以看到权限不对,先想想自己是不是文件的属主。
4.5 一切皆文件:不只是口号
「一切皆文件」这句话常被当成一句玄学口号,其实它是 Unix 最实在的一个设计决定:对数据文件、程序文件、设备文件、网络文件等的管理,全部抽象为文件,用统一的方式方法管理。这么做的直接好处是,你学会一套操作(打开、读、写、关闭、设权限),就能管住几乎所有东西。
当然,抽象归抽象,类型还是要分。常用的文件类型有五种:普通文件,用来长期存放数据、程序等信息,包括文本文件、数据文件、可执行的二进制程序;目录文件,系统把目录本身也当成一种特殊文件,用它构成树型结构,每个目录文件至少包含.和..两个条目,用户进程可以读取目录,但不能修改;设备文件,每个设备都映射成一个文件,存放在/dev下,分字符设备和块设备,字符设备按一个字符存取,块设备按字符块存取,比如行式打印机对应/dev/lp,第一个软盘驱动器对应/dev/fd0;管道文件,多用于进程间通信;链接文件,类似于 Windows 下的快捷方式,又分软链接和硬链接。
还有一个和 Windows 习惯相冲的点:在 Unix/Linux 里,文件可以没有扩展名。系统判断类型靠的是文件本身的内容和元信息,不是名字后面的那几个字符。想确认某个文件到底是什么,用file命令:后面跟文件名就看指定文件,跟通配符*就把当前目录下所有文件的类型都列一遍。这套「看内容不看名字」的思路,和权限、目录一起,构成了 Linux 区别于 Windows 的底层性格。
5. 常见误区:六个「以为懂了」的分界线
5.1 误区一:Unix 和 Linux 是同一个东西
这大概是最普遍的一条。名字长得像,用起来更像——目录结构一样、常用命令一样、连权限显示都一模一样,很容易让人得出「Linux 就是 Unix 的新版本」这个结论。
混淆的根源在于「类 Unix」这三个字的含义被忽略了。Linux 在设计上全面对标 Unix,接口、行为、哲学都在学,但它是重新写的一套内核,不是从 Unix 代码里长出来的分支。Unix 那一支经历过商业授权和版权纠纷,代码血统有明确的商业传承;Linux 是从教学系统起步、由社区逐步补全的自由软件。怎么区分?记住一句话:Unix 是那个老祖宗和它的商业后代,Linux 是照着老祖宗的样子重新造的一辆车,零件全是新的。
5.2 误区二:内核版本和发行版版本是一回事
装完系统一查版本号,看到一串数字,就默认这就是「Linux 的版本」。问题是,同一台机器上其实有两套版本号在跑。
混淆的原因是两边都叫「版本」,而且都跟升级有关。内核版本是心脏的版本,分稳定版和开发版,稳定版强调工业级强度、可以广泛部署,新版主要是修 bug 和加驱动;开发版试验新方案,变化很快。发行版版本是整车的版本,它打包了内核、函数库、桌面环境、办公套件、数据库等等。怎么区分?升级内核和升级发行版是两件事:前者换的是心脏,后者换的是整车配置,可能顺带把心脏也换了,也可能不换。看到版本号先问一句:这是内核的还是发行版的。
5.3 误区三:文件类型靠扩展名判断
带着 Windows 习惯过来的人,看到没有后缀的文件会本能地觉得「这不完整」。更麻烦的是,有人会试图靠改名来「转换」文件类型。
混淆的原因是 Windows 那套「扩展名即类型」的规则太深入人心。但在 Unix/Linux 里,文件类型是通过文件类型来判断的——看的是内容与元信息,不是名字。文件名最长可以有 256 个字符,以.开头的文件是隐藏文件,需要加参数才显示;这些规则和扩展名都没关系。怎么区分?三条路:用file命令看真实类型,用ls -l第一列首字母看文件类型,用权限位里的x判断能不能执行。改后缀名只会让名字变,不会让文件变。
5.4 误区四:读权限在所有地方都是一个意思
看到r就以为「能读」,看到w就以为「能改」,看到x就以为「能运行」——这套理解在文件上基本对,套到目录上就全歪了。
混淆的原因是三档权限的名字起得太通用。实际上,对文件而言,读是读取内容、写是新增修改内容、执行是执行文件;对目录而言,读是浏览目录、写是删除移动目录内的文件、执行是进入目录。怎么区分?记住一句话:目录的权限管的是「它里面的条目」,不是目录这个对象本身。所以会出现这种组合——有读没执行,你能看见文件名但进不去;有执行没读,你进得去但看不见里面有什么。这两个反直觉的组合,恰恰是理解目录权限的关键。
5.5 误区五:根目录、家目录、管理员家目录是一回事
/、/home/xxx、/root,三个都带「根」或者「家」的意思,初学时很容易糊成一团。
混淆的原因是命名上的巧合。/是整棵目录树的起点,有且只有一个,所有东西都从它开始;/home是普通用户家目录的集合,新增账号时家目录都建在这下面,~表示当前用户的家目录,~edu表示 edu 这个用户的家目录;/root则是管理员自己的家目录,故意和/home分开,就是为了避免普通用户的家目录和管理员的家目录混在一起。怎么区分?看用途:/是地址的起点,/home/xxx是某个普通用户的私人空间,/root是管理员的私人空间。
5.6 误区六:图形界面是 Linux 的必需部分
桌面越做越漂亮,容易让人以为「有界面才叫完整的系统」。于是有人判断一个 Linux 好不好,就看它的桌面好不好看。
混淆的原因是把外衣当成了骨架。X Window 系统是客户机/服务器结构的,和操作系统内核是分开实现的,而且它本来就不是 Unix/Linux 的必需构成部分,只是一个可选的应用程序组件。换句话说,没有图形界面,系统照样完整运行;图形界面挂了,底层文件系统和命令照样能用。怎么区分?看它在哪里:桌面环境、办公套件、媒体播放器属于应用层,内核、文件组织、目录结构才是骨架。判断一个系统是否可靠,看得是骨架,不是外衣。
6. 什么时候该打开终端:三条边界判断
命令行这件事,容易走两个极端:一边觉得黑屏幕才是高手,凡事都要敲命令;另一边觉得有图形界面为什么还要记那些参数。讲义里那句话说得挺实在——不会命令行,就不算会 Linux。但「必须会」不等于「处处用」。
先说我自己的判断顺序:看这件事是不是要重复很多次,看这台机器有没有图形界面,看这套操作要不要留痕给别人复现。
批量的事情,终端几乎是唯一解。改一个文件名,右键重命名当然更快;但要给两百个文件统一加前缀、统一换后缀,图形界面点到手酸,一条带通配符的命令就完了。讲义里列的那套通配符就是为这个准备的:*代表任意多个字符,?代表任意一个字符,[a-f]匹配范围内的任意一个字符,方括号外的-只是普通字符。这些符号单看很抽象,配上批量场景就变得非常好用。
| 场景 | 终端更顺手 | 图形界面更顺手 |
|---|---|---|
| 批量重命名、批量改权限 | 一条命令搞定,可重复执行 | 逐个点,容易漏 |
| 改一个配置文件里的一行 | 也行,但要记编辑器 | 打开就改,所见即所得 |
| 连一台没有显示器的机器 | 只能这样 | 用不了 |
| 把操作过程交给别人复现 | 命令本身就是步骤清单 | 得录屏或截图说明 |
| 一次性看张图片、拖个文件 | 绕远路 | 直接拖,最快 |
再说什么时候别用。如果只是改一个文件里的错别字,开终端、想命令、拼路径的时间够你在图形编辑器里改十遍了;如果整个团队都没有命令行习惯,你写一堆脚本反而没人维护,血泪经验是:工具要匹配使用它的人。还有一类情况要格外小心——涉及删除、覆盖的操作。讲义里提到,>这个重定向符号,如果目标文件不存在就创建,存在则直接覆盖内容,没有二次确认。这类命令我一般先在/tmp下拿几个无关紧要的文件试一遍,确认通配符展开的范围符合预期,再对真实目录动手。
有个习惯我保持了挺久:每学一个新命令,先用--help看一眼自带说明;说明不够清楚,就man一下。这里有个小坑值得提前知道——man手册是分章节的,标准命令、系统调用、库函数、设备文件、文件格式各占一章,按章节号顺序搜索。所以当命令名和函数名撞车时,直接man printf只会查到命令那一份,不会翻到库函数;想要准确结果,就带上章节号,比如man 1 ls表示只看第 1 章的标准命令说明。翻页用空格下一屏、回车滚一行、b回滚、f前滚、q退出、/word搜索,这几个键记住就够用了。另外两个提速的小技巧:敲命令前几个字母时按 Tab 自动补全,省得拼错;
本文还有配套的精品资源,点击获取