《Linux命令行大全》第2版是一本什么样的书

这是一本全面讲述Linux命令行用法的图书。本书从更广泛的意义上向你传授如何使用CLI、CLI工作原理、CLI都有哪些功能,以及最佳实践是什么。

这不是一本有关Linux操作系统管理的图书。任何关于命令行的严肃讨论都会不可避免地转向操作系统管理方面的话题,本书仅触及少数管理问题。为了让你能开展后续的学习,本书提供了坚实的命令行基础知识,这可是完成重要的系统管理任务必不可少的工具。

本书以Linux为中心,只讨论当前的Linux发行版。尽管本书95%的内容对其他类UNIX系统用户也有帮助,但本书主要还是面向目前的Linux命令行用户。

linux常用命令一览表(Linux命令行大全第2版来啦)(1)

第2版中的新内容

尽管基本结构和内容保持不变,但第2版其实做了各种改善、更新,并与时俱进,其中有很多是基于读者的反馈。除此之外,还有两处特别的改进。首先,本书现在假定使用Bash 4.x,该版本在初稿时并未广泛使用。Bash的4.x版添加了一些新特性,我们自然不会错过。其次,对本书第四部分进行了更新,提供了更好的脚本实践示例。第四部分中包含的脚本已经做出了修订,以使其更加稳健,同时我还修复了其中的几处错误。

为什么使用命令行

你有没有注意到,电影里的“超级黑客”(就是那些用不了半分钟就能侵入极为安全的计算机的人)端坐在计算机前时,从来都没碰过鼠标?这是因为制片人清楚,作为人类,我们从本能上就知道,要想在计算机上真正“搞定一切”的方式就是通过键盘输入命令!

如今的大多数计算机用户只熟悉图形用户界面(Graphical User Interface,GUI),甚至少数厂商和专家说命令行界面(Command Line Interface,CLI)是过去的玩意儿。这真遗憾,良好的CLI是一种极富表达力的人机交互方式,就像人们之间的书信交流一样。“GUI使简单的任务更简单,而CLI使完成艰难的任务成为可能。”这句话放到今天仍然正确。

由于Linux操作系统参照了UNIX系列操作系统,因此分享了UNIX丰富的命令行工具。UNIX操作系统在20世纪80年代早期就占据了主流地位(尽管它在20世纪70年代才被开发出来),GUI在当时尚未被广泛采用,因此诞生了大量的CLI。事实上,Linux的早期实践者选择Linux而非Windows NT的主要原因之一就是,其强大的CLI使“完成艰难的任务成为可能”。

学习本书的你

本书适合从其他操作系统转向Linux的新用户。你很可能曾是某一版Windows的“高手”;也可能是老板让你去管理Linux服务器,或是自己走进了像树莓派这样的单板计算机(Single Board Computer,SBC)的神奇新世界;又或者是厌烦了各种安全问题的桌面用户,想要体验Linux操作系统。这都无妨,欢迎阅读。

话虽如此,但万事开头难,学习命令行也不例外。学习命令行是一项挑战,需要付出辛勤的汗水。这倒不是说它有多难,而是它涵盖的内容着实广泛。在普通的Linux操作系统中,能够在命令行上使用的程序数以千计,这毫不夸张。先提醒你自己,学习命令行可不是件容易的事。

然而,学习Linux命令行所带来的回报颇丰。如果你觉得自己是“高手”,那么先等一等吧。你对真正的“力量”还一无所知。而且,不考虑其他的计算机技能,命令行知识是经久不衰的。你今天学到的知识在10年后仍旧管用。命令行知识经受得住时间的考验。

如果你没有编程经验,也不用担心,依然可以从本书开始学起。

《Linux命令行大全》第2版内容结构

本书的内容经过精心编排,阅读时你会感觉就像有一位老师坐在身旁手把手地指导你。许多作者可能采用系统化的方法来讲解书中的内容。从我的角度来讲,这很合理,但是对初学者而言,可能会让人摸不着头脑。

本书的另一个目标是让你熟悉UNIX的思考方式,它不同于Windows的思考方式。在此过程中,我们还会帮助你理解命令行的工作原理和方式。Linux不仅仅是一个软件,还是庞大的UNIX文化中的一小部分,有自己的语言和历史。

本书包括4个部分,每一部分都涵盖了命令行不同方面的知识。

· 第一部分:学习Shell。这部分开启命令行基础知识的学习之旅,包括命令结构、浏览文件系统、编辑命令行以及查找命令帮助和文档。

· 第二部分:配置与环境。这部分讲述编辑配置文件,如何通过命令行的方式控制计算机操作。

· 第三部分:常见任务与必备工具。这部分探讨很多在命令行上执行的常规任务。类UNIX系统,例如Linux,包含大量“经典的”命令行程序,可用于对数据执行强有力的操作。

· 第四部分:编写Shell脚本。这部分介绍Shell编程,它是一项公认的基础技术,但并不难学,很多常见计算任务能借助其实现自动化。通过学习Shell编程,你会熟悉一些同样能够应用于其他编程语言中的概念。

学习之前你需要的预备知识

为了阅读本书,你只需要安装好Linux操作系统。可以通过下列任意一种方式实现。

在计算机(不用是最新的)上安装Linux。无论选择哪个Linux发行版都没有问题,不过大多数人会从Ubuntu、Fedora、OpenSUSE中选择。如果你拿不准,就先试一试Ubuntu。安装现代Linux发行版时,由于硬件配置不同,要么简单至极,要么难得令人发指。建议采用近两年的桌面计算机,至少配备2GB的内存和6GB的空闲磁盘空间。尽可能避免使用笔记本计算机和无线网络,因为这二者经常难以正常工作。

使用LiveCD或U盘。许多Linux发行版有一个挺酷的功能,你可以直接通过CD-ROM或U盘运行Linux,完全不用安装。只需进入BIOS设置界面,将计算机设为从CD-ROM或USB设备启动,然后重启即可。使用这种方法可以在安装之前很好地测试硬件兼容性。缺点在于相较于在硬盘上安装的Linux,运行速度会比较慢。Ubuntu和Fedora(以及其他发行版)都有LiveCD版本。

不管你用哪种方式安装Linux,都会偶尔需要超级用户(也就是管理员)权限来完成本书中的某些任务。

安装好之后,就可以边读边练习了。本书的大部分内容需要你“亲自动手”学习。

为什么没有采用“GNU/Linux”的称谓

在某些群体中,将Linux操作系统称为“GNU/Linux操作系统”。其实不存在哪种称呼“Linux”的方式完全正确,因为它是由遍布世界各地的开发人员共同造就的。从技术层面来讲,Linux只是操作系统内核的名称,仅此而已。内核自然非常重要,没有它,操作系统就无法运转,但是它并不足以构成一个完整的操作系统。

理查德·马修·斯托曼是一位“天才哲学家”。他发起自由软件运动,成立了自由软件基金会,创建了自由软件项目并编写了GNU C语言编译器(GCC)的第一个版本,还制定了GNU通用公共许可证(GNU General Public License,GPL)等。他坚持将Linux称为“GNU/LINUX”,目的是准确地反映GNU项目对Linux操作系统做出的贡献。尽管GNU项目先于Linux内核出现,其贡献有目共睹,不容忽视。但是将GNU也加入名称中,对其他为Linux操作系统的发展做出巨大贡献的人来说是不公平的。除此之外,由于Linux内核先于其他程序启动,因此我觉得“Linux/GNU”这个名称在技术上更为准确。

在目前流行的名称中,“Linux”指代的是内核和在典型的Linux发行版中出现的所有其他自由和开源软件,也就是整个Linux生态环境,而不仅仅是GNU的组成部分。操作系统市场似乎偏好单个词的名称,例如DOS、Windows、macOS、Solaris、Irix、AIX。我也选择使用这个名称。但如果你更喜欢“GNU/Linux”,那么阅读时请在脑海中执行“查找—替换”操作。

详细目录

第一部分 学习Shell 第1章 什么是Shell 3 1.1 终端仿真器 3 1.2 小试牛刀 4 1.2.1 命令历史 4 1.2.2 光标移动 4 1.3 几个简单的命令 5 1.4 结束终端会话 6 1.5 总结 6 第2章 导航 7 2.1 理解文件系统树 7 2.2 当前工作目录 8 2.3 列出目录内容 8 2.4 更改当前工作目录 9 2.4.1 绝对路径名 9 2.4.2 相对路径名 9 2.4.3 一些有用的便捷写法 11 2.5 总结 11 第3章 探索Linux系统 12 3.1 使用ls命令之乐 12 3.1.1 选项与参数 13 3.1.2 进一步了解长格式 14 3.2 使用file命令确定文件类型 15 3.3 使用less命令查看文本文件 15 3.4 按图索骥 17 3.5 符号链接 19 3.6 硬链接 20 3.7 总结 20 第4章 操作文件和目录 21 4.1 通配符 22 4.2 mkdir——创建目录 24 4.3 cp——复制文件和目录 24 4.4 mv——移动和重命名文件 25 4.5 rm——删除文件和目录 26 4.6 ln——创建硬链接和符号链接 27 4.6.1 硬链接 27 4.6.2 符号链接 28 4.7 实战演练 28 4.7.1 创建目录 28 4.7.2 复制文件 29 4.7.3 移动和重命名文件 29 4.7.4 创建硬链接 30 4.7.5 创建符号链接 31 4.7.6 删除文件和目录 32 4.8 总结 34 第5章 和命令打交道 35 5.1 命令究竟是什么 35 5.2 识别命令 36 5.2.1 type—显示命令类型 36 5.2.2 which—显示可执行 文件的位置 36 5.3 获取命令文档 37 5.3.1 help—获取Shell内建 命令的帮助信息 37 5.3.2 --help—显示用法信息 38 5.3.3 man—显示命令的 手册页 38 5.3.4 apropos—显示适合的 命令清单 40 5.3.5 whatis—显示手册页的 简述 40 5.3.6 info—显示程序的info 条目 41 5.3.7 文档文件 42 5.4 使用alias创建自己的命令 42 5.5 总结 44 第6章 重定向 45 6.1 标准输入、标准输出及 标准错误 45 6.2 标准输出重定向 46 6.3 标准错误重定向 47 6.3.1 将标准输出和标准错误 重定向到同一个文件中 48 6.3.2 丢弃用不着的输出结果 48 6.4 标准输入重定向 49 6.5 管道 50 6.5.1 排序列表 51 6.5.2 uniq—报告或忽略 重复行 52 6.5.3 wc—统计文件中换行符、 单词以及字节的数量 52 6.5.4 grep—输出与模式 匹配的行 53 6.5.5 head/tail—输出文件的 开头/结尾部分 53 6.5.6 tee—读取标准输入 并将输出结果写入 标准输出和文件 54 6.6 总结 55 第7章 “Shell眼”看世界 56 7.1 扩展 56 7.1.1 路径名扩展 57 7.1.2 浪纹线扩展 58 7.1.3 算术扩展 59 7.1.4 花括号扩展 60 7.1.5 参数扩展 61 7.1.6 命令替换 61 7.2 引用 62 7.2.1 双引号 62 7.2.2 单引号 64 7.2.3 转义字符 64 7.2.4 反斜线转义序列 65 7.3 总结 65 第8章 高级键盘技巧 66 8.1 编辑命令行 66 8.1.1 光标移动 67 8.1.2 修改文本 67 8.1.3 剪切和粘贴文本 67 8.2 补全功能 68 8.3 命令历史记录 70 8.3.1 搜索历史记录 70 8.3.2 历史扩展 71 8.4 总结 72 第9章 权限 73 9.1 属主、属组以及其他用户 74 9.2 读取、写入和执行 75 9.2.1 chmod—修改文件 模式 76 9.2.2 使用GUI设置文件模式 79 9.2.3 umask—设置默认权限 79 9.2.4 一些特殊的权限 80 9.3 改变用户身份 81 9.3.1 su—以其他用户身份 启动Shell 82 9.3.2 sudo—以其他用户身份执行命令 83 9.3.3 chown—更改文件属主和 属组 84 9.3.4 chgrp—更改文件属组 85 9.4 行使权限 85 9.5 修改密码 87 9.6 总结 88 第10章 进程 89 10.1 进程的工作方式 90 10.2 查看进程 90 10.3 进程控制 94 10.3.1 中断进程 94 10.3.2 将进程置于后台 95 10.3.3 使进程返回前台 95 10.3.4 停止进程 96 10.4 信号 96 10.4.1 使用kill命令向进程发送 信号 97 10.4.2 使用killall命令向多个 进程发送信号 98 10.5 关闭系统 99 10.6 更多与进程相关的命令 99 10.7 总结 100 第二部分 配置与环境 第11章 环境 103 11.1 环境中都保存了什么 103 11.1.1 检查环境 104 11.1.2 一些值得注意的环境 变量 105 11.2 如何建立环境 106 11.3 修改环境 108 11.3.1 应该修改哪些文件 108 11.3.2 文本编辑器 109 11.3.3 使用文本编辑器 109 11.3.4 使改动生效 112 11.4 总结 112 第12章 Vi入门 113 12.1 为什么要学习Vi 113 12.2 背景知识 114 12.3 启动和退出Vi 114 12.4 编辑模式 116 12.4.1 进入插入模式 116 12.4.2 保存文件 117 12.5 光标移动 117 12.6 基本编辑 118 12.6.1 追加 118 12.6.2 新建 119 12.6.3 删除 120 12.6.4 剪切、复制及粘贴 121 12.6.5 合并 122 12.7 搜索和替换 122 12.7.1 行内搜索 122 12.7.2 搜索整个文件 122 12.7.3 全局搜索和替换 123 12.8 编辑多个文件 124 12.8.1 在文件之间切换 125 12.8.2 载入更多的文件进行 编辑 125 12.8.3 将一个文件的内容复制到 另一个文件 126 12.8.4 将整个文件插入另一个 文件 127 12.9 保存工作 128 12.10 总结 128 第13章 定制提示符 129 13.1 分解提示符 129 13.2 换一种提示符 131 13.3 增加颜色 132 13.4 移动光标 134 13.5 保存提示符 135 13.6 总结 135 第三部分 常见任务与必备工具 第14章 软件包管理 139 14.1 打包系统 140 14.2 软件包的工作方式 140 14.2.1 软件包文件 140 14.2.2 仓库 141 14.2.3 依赖性 141 14.2.4 低层和高层工具 141 14.3 常见的软件包管理任务 142 14.3.1 在仓库中查找软件包 142 14.3.2 安装仓库中的软件包 142 14.3.3 安装软件包文件中的 软件包 142 14.3.4 删除软件包 143 14.3.5 通过仓库更新软件包 143 14.3.6 通过软件包文件更新 软件包 144 14.3.7 列举已安装的软件包 144 14.3.8 确定软件包是否已安装 144 14.3.9 显示已安装软件包的 相关信息 145 14.3.10 识别某个文件是哪个 软件包安装的 145 14.4 总结 145 第15章 存储介质 147 15.1 存储设备的挂载与卸载 148 15.1.1 查看已挂载的文件系统 列表 149 15.1.2 确定设备名称 152 15.2 创建新文件系统 154 15.2.1 用fdisk操作分区 154 15.2.2 使用mkfs创建新的文件 系统 156 15.3 文件系统的检查和修复 157 15.4 在设备之间直接移动数据 158 15.4.1 向可刻录CD写入数据 159 15.4.2 创建CD-ROM的ISO 映像文件 159 15.4.3 用文件集合创建ISO 映像文件 159 15.5 写入CD-ROM的ISO映像 文件 160 15.5.1 直接挂载ISO映像 文件 160 15.5.2 擦除可刻录CD 161 15.5.3 刻录映像文件 161 15.6 总结 161 第16章 联网 162 16.1 网络检查与监控 163 16.1.1 ping 163 16.1.2 traceroute 164 16.1.3 ip 165 16.1.4 netstat 165 16.2 通过网络传输文件 166 16.2.1 ftp 167 16.2.2 lftp——更好的ftp 168 16.2.3 wget 168 16.3 与远程主机的安全通信 169 16.3.1 ssh 169 16.3.2 scp与sftp 172 16.4 总结 173 第17章 查找文件 174 17.1 locate——简单的文件查找 方法 174 17.2 find——复杂的文件查找 方法 176 17.2.1 测试条件 176 17.2.2 操作符 178 17.2.3 预定义操作 180 17.2.4 用户自定义操作 182 17.2.5 提高效率 182 17.2.6 xargs 183 17.2.7 实战演练 184 17.2.8 find命令选项 185 17.3 总结 186 第18章 归档与备份 187 18.1 压缩文件 187 18.1.1 gzip 188 18.1.2 bzip2 190 18.2 文件归档 191 18.2.1 tar 191 18.2.2 zip 195 18.3 同步文件与目录 196 18.4 总结 199 第19章 正则表达式 200 19.1 什么是正则表达式 200 19.2 grep 201 19.3 元字符与文字字符 202 19.4 任意字符 203 19.5 锚点 203 19.6 方括号表达式与字符类 204 19.6.1 排除 205 19.6.2 传统的字符范围 205 19.7 POSIX字符类 206 19.8 POSIX基本型正则表达式与 扩展型正则表达式 209 19.9 多选结构 210 19.10 量词 211 19.10.1 ?——匹配0次或1次 211 19.10.2 *——匹配0次或多次 212 19.10.3 ——匹配1次或多次 212 19.10.4 {}——匹配指定次数 213 19.11 实战演练 213 19.11.1 使用grep验证电话号码 列表 213 19.11.2 使用find查找路径名 214 19.11.3 使用locate搜索文件 215 19.11.4 使用Less和Vim搜索 文本 215 19.12 总结 217 第20章 文本处理 218 20.1 文本的应用 219 20.1.1 文档 219 20.1.2 网页 219 20.1.3 电子邮件 219 20.1.4 打印机输出 219 20.1.5 程序源代码 219 20.2 温故知新 220 20.2.1 cat—连接文件并 打印 220 20.2.2 sort—排序 221 20.2.3 uniq—删除重复行 227 20.3 切片和切块 228 20.3.1 cut——从每行中删除 部分内容 229 20.3.2 paste——合并行 231 20.3.3 join——连接两个文件中 具有公共字段的行 233 20.4 比较文本 235 20.4.1 comm——逐行比较两个 已排序的文件 235 20.4.2 diff——逐行比较文件 236 20.4.3 patch——对原文件应用 diff文件 238 20.5 即时编辑 239 20.5.1 tr——转写或删除字符 239 20.5.2 sed——用于文本过滤和 转换的流编辑器 240 20.5.3 aspell——交互式拼写 检查器 247 20.6 总结 250 第21章 格式化输出 251 21.1 简单的格式化工具 251 21.1.1 nl——对行进行编号 252 21.1.2 fold——在指定长度处 折行 254 21.1.3 fmt——一个简单的文本 格式化工具 255 21.1.4 pr——格式化要输出的 文本 258 21.1.5 printf——格式化并输出 数据 259 21.2 文档格式化系统 261 21.3 总结 267 第22章 打印 268 22.1 打印简史 268 22.1.1 “黑暗”时代 269 22.1.2 基于字符的打印机 269 22.1.3 图形化打印机 270 22.2 Linux的打印功能 271 22.3 准备文件打印 271 22.4 将打印作业发送至打印机 272 22.4.1 lpr—以Berkeley风格 打印文件 272 22.4.2 lp—以System V风格 打印文件 273 22.4.3 a2ps—在PostScript 打印机上打印文件 274 22.5 监控打印作业 276 22.5.1 lpstat——显示打印系统 状态 276 22.5.2 lpq——显示打印队列 状态 277 22.5.3 lprm/cancel——取消打印 作业 278 22.6 总结 278 第23章 编译程序 279 23.1 什么是编译 280 23.2 编译C程序 281 23.2.1 获取源代码 281 23.2.2 检查源代码树 283 23.2.3 构建程序 284 23.2.4 安装程序 288 23.3 总结 288 第四部分 编写Shell脚本 第24章 编写第一个脚本 291 24.1 什么是Shell脚本 291 24.2 如何创建并执行Shell脚本 292 24.2.1 脚本文件格式 292 24.2.2 可执行权限 293 24.2.3 脚本位置 293 24.2.4 脚本的理想位置 294 24.3 更多的格式技巧 294 24.3.1 长选项 295 24.3.2 缩进与续行 295 24.4 总结 296 第25章 启动项目 297 25.1 第一阶段:最小化文档 297 25.2 第二阶段:添加数据 299 25.3 变量与常量 300 25.3.1 为变量与常量赋值 302 25.3.2 here document 304 25.4 总结 306 第26章 自顶向下设计 307 26.1 Shell函数 308 26.2 局部变量 311 26.3 保持脚本执行 312 26.4 总结 315 第27章 流程控制:if分支 316 27.1 if语句 317 27.2 退出状态 317 27.3 使用test 319 27.3.1 文件表达式 319 27.3.2 字符串表达式 322 27.3.3 整数表达式 323 27.4 更现代的test 324 27.5 (())——为整数设计 325 27.6 组合表达式 326 27.7 控制操作符:另一种分支 方式 329 27.8 总结 329 第28章 读取键盘输入 331 28.1 read——从标准输入读取值 332 28.1.1 选项 334 28.1.2 IFS 336 28.2 验证输入 338 28.3 菜单 339 28.4 总结 341 第29章 流程控制:while/until循环 342 29.1 循环 342 29.2 跳出循环 345 29.3 使用循环读取文件 347 29.4 总结 348 第30章 故障诊断 349 30.1 语法错误 349 30.1.1 缺少引号 350 30.1.2 缺少词法单元 351 30.1.3 出乎意料的扩展 351 30.2 逻辑错误 353 30.2.1 防御式编程 353 30.2.2 小心文件名 354 30.2.3 核实输入 355 30.3 测试 355 30.4 调试 357 30.4.1 查找问题区域 357 30.4.2 跟踪 357 30.4.3 在执行过程中检查值 359 30.5 总结 360 第31章 流程控制:case分支 361 31.1 case命令 361 31.1.1 模式 363 31.1.2 执行多次操作 365 31.2 总结 366 第32章 位置参数 367 32.1 访问命令行 367 32.1.1 确定参数个数 369 32.1.2 shift——访问多个参数 369 32.1.3 简单应用 371 32.1.4 在Shell函数中使用 位置参数 371 32.2 批量处理位置参数 372 32.3 一个更完整的应用 374 32.4 总结 377 第33章 流程控制:for循环 380 33.1 for的传统形式 380 33.2 for的C语言形式 383 33.3 总结 384 第34章 字符串与数字 387 34.1 参数扩展 387 34.1.1 基本参数 388 34.1.2 管理空变量扩展 388 34.1.3 返回变量名的扩展 390 34.1.4 字符串操作 390 34.1.5 大小写转换 393 34.2 算术求值与扩展 395 34.2.1 数字基数 395 34.2.2 一元操作符 395 34.2.3 简单算术 395 34.2.4 赋值 397 34.2.5 位操作 399 34.2.6 逻辑操作 399 34.3 bc——任意精度计算器语言 401 34.3.1 使用bc 402 34.3.2 示例脚本 403 34.4 总结 404 第35章 数组 405 35.1 什么是数组 405 35.1.1 创建数组 406 35.1.2 为数组赋值 406 35.1.3 访问数组元素 406 35.2 数组操作 408 35.2.1 输出数组的全部内容 408 35.2.2 确定数组元素的数量 409 35.2.3 查找数组使用的索引 410 35.2.4 向数组尾部添加元素 410 35.2.5 数组排序 410 35.2.6 删除数组 411 35.3 关联数组 412 35.4 总结 412 第36章 其他命令 413 36.1 分组命令与子Shell 413 36.2 陷阱 419 36.3 使用wait实现异步执行 421 36.4 具名管道 423 36.4.1 创建具名管道 423 36.4.2 使用具名管道 424 36.5 总结 424

,