linux常用命令一览表(Linux命令行大全第2版来啦)
这是一本全面讲述Linux命令行用法的图书。本书从更广泛的意义上向你传授如何使用CLI、CLI工作原理、CLI都有哪些功能,以及最佳实践是什么。
这不是一本有关Linux操作系统管理的图书。任何关于命令行的严肃讨论都会不可避免地转向操作系统管理方面的话题,本书仅触及少数管理问题。为了让你能开展后续的学习,本书提供了坚实的命令行基础知识,这可是完成重要的系统管理任务必不可少的工具。
本书以Linux为中心,只讨论当前的Linux发行版。尽管本书95%的内容对其他类UNIX系统用户也有帮助,但本书主要还是面向目前的Linux命令行用户。
第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
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com