《The Linux Command Line》读书笔记
文章目录
- 《The Linux Command Line》读书笔记
- 第一章 略
- 第二章 Shell
- 第三章 文件系统
- 第四章 探究OS
- 第五章 操作文件和目录
- 第六章 使用命令
- 第七章 重定向
- 第八章 Shell
- 第九章 快捷键
- 第十章 权限
- 第十一章 进程
第一章 略
第二章 Shell
- Shell: 一个程序,接受键盘输入的命令,传递给OS执行。
- bash:Bourne Again SHell
- 终端:
- #su,$u
- 即使终端没有运行,在后台仍然有几个终端会话运行着。它们叫做虚拟终端 或者是虚拟控制台
第三章 文件系统
- 类 Unix 操作系统,总是只有一个单一的文件系统树,不管有多少个磁盘或者存储设备连接到计算机上。
- cd pwd ls
第四章 探究OS
-
选项和参数:
- 命令名经常会带有一个或多个用来改变命令行为的选项, 更进一步,选项后面会带有一个或多个参数,这些参数是命令作用的对象
- 大多数命令使用的选项,是由一个中划线加上一个字符组成,例如,“-l”,
- 但是许多命令,包括来自于 GNU 项目的命令,也支持长选项,长选项由两个中划线加上一个字组成
- 当然, 许多命令也允许把多个短选项串在一起使用
-
file filename // 描述文件信息
-
less filename // 阅读文本文件,b 上一页 & space 下一页
-
目录:
目录 内容 / 根目录,万物起源。 /bin 包含系统启动和运行所必须的二进制程序。 /boot 包含 Linux 内核、初始 RAM 磁盘映像(用于启动时所需的驱动)和 启动加载程序。 /dev 这是一个包含设备结点的特殊目录。“一切都是文件”,也适用于设备。 在这个目录里,内核维护着所有设备的列表。 /etc 这个目录包含所有系统层面的配置文件。它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会开启每个系统服务。这个目录中的任何文件应该是可读的文本文件。 /home 在通常的配置环境下,系统会在 /home 下,给每个用户分配一个目录。普通用户只能 在自己的目录下写文件。这个限制保护系统免受错误的用户活动破坏。 /lib 包含核心系统程序所使用的共享库文件。这些文件与 Windows 中的动态链接库相似。 /lost+found 每个使用 Linux 文件系统的格式化分区或设备,例如 ext3文件系统, 都会有这个目录。当部分恢复一个损坏的文件系统时,会用到这个目录。这个目录应该是空的,除非文件系统 真正的损坏了。 /media 在现在的 Linux 系统中,/media 目录会包含可移动介质的挂载点, 例如 USB 驱动器,CD-ROMs 等等。这些介质连接到计算机之后,会自动地挂载到这个目录结点下。 /root root 帐户的home目录。 /sbin 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留。 /tmp 这个/tmp 目录,是用来存储由各种程序创建的临时文件的地方。系统每次 重新启动时,都会清空这个目录。 /usr 在 Linux 系统中,/usr 目录可能是最大的一个。它包含普通用户所需要的所有程序和文件。 /usr/bin /usr/bin 目录包含系统安装的可执行程序。通常,这个目录会包含许多程序。 /usr/lib 包含由/usr/bin 目录中的程序所用的共享库。 /usr/local 这个/usr/local 目录,是非系统发行版自带程序的安装目录。 通常,由源码编译的程序会安装在/usr/local/bin 目录下。新安装的 Linux 系统中会存在这个目录, 并且在管理员安装程序之前,这个目录是空的。 /usr/sbin 包含许多系统管理程序。 /usr/share /usr/share 目录包含许多由 /usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件、图标、桌面背景、音频文件等等。 /usr/share/doc 大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分类的文档。 /var 除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录存放的是动态文件。各种数据库,假脱机文件, 用户邮件等等,都位于在这里。 /var/log 这个/var/log 目录包含日志文件、各种系统活动的记录。这些文件非常重要,并且 应该时时监测它们。其中最重要的一个文件是 /var/log/messages。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件。 -
软链接:一个文件被多个文件名所指向
作用:一个程序要求使用某个包含在名为“foo”文件中的共享资源,但是“foo”经常改变版本号。 这样在文件名中包含版本号,会是一个好主意,因此管理员或者其它相关方,会知道安装了哪个“foo”版本。 这会导致另一个问题:如果我们更改了共享资源的名字,那么我们必须跟踪每个可能使用了 这个共享资源的程序,当每次这个资源的新版本被安装后,都要让使用了它的程序去寻找新的资源名。
符号链接避免了这种情况。比方说,我们安装了文件 “foo” 的 2.6 版本,它的 文件名是 “foo-2.6”,然后创建了叫做 “foo” 的符号链接,这个符号链接指向 “foo-2.6”。 这意味着,当一个程序打开文件 “foo” 时,它实际上是打开文件 “foo-2.6”。 现在,每个人都很高兴。依赖于 “foo” 文件的程序能找到这个文件,并且我们能知道安装了哪个文件版本。 当升级到 “foo-2.7” 版本的时候,仅添加这个文件到文件系统中,删除符号链接 “foo”, 创建一个指向新版本的符号链接。这不仅解决了版本升级问题,而且还允许在系统中保存两个不同的文件版本。 假想 “foo-2.7” 有个错误(该死的开发者!),那我们得回到原来的版本。 一样的操作,我们只需要删除指向新版本的符号链接,然后创建指向旧版本的符号链接就可以了。
第五章 操作文件和目录
-
虽然 GUI 能轻松地实现简单的文件操作,但是对于复杂的文件操作任务,则使用命令行程序比较容易完成。
例如:拷贝一个目录下的 HTML 文件到目标目录,保证只拷贝目标目录不存在或者版本比目标目录文件更新的文件. cp -u *.html destination
-
通配符:shell 特性,帮助快速指定一组文件名
通配符 意义 * 匹配任意多个字符(包括零个或一个) ? 匹配任意一个字符(不包括零个) [characters] 匹配任意一个属于字符集(characters)中的字符 [!characters] 匹配任意一个不是字符集中的字符 [[:class:]] 匹配任意一个属于指定字符类中的字符 - 普遍使用的字符类
字符类 意义 [:alnum:] 匹配任意一个字母或数字 [:alpha:] 匹配任意一个字母 [:digit:] 匹配任意一个数字 [:lower:] 匹配任意一个小写字母 [:upper:] 匹配任意一个大写字母 -
举例:
* 所有文件 g* 文件名以“g”开头的文件 b*.txt 以"b"开头,中间有零个或任意多个字符,并以".txt"结尾的文件 Data??? 以“Data”开头,其后紧接着3个字符的文件 [abc]* 文件名以"a",“b”,或"c"开头的文件 BACKUP.[0-9][0-9][0-9] 以"BACKUP."开头,并紧接着3个数字的文件 [[:upper:]]* 以大写字母开头的文件 [![:digit:]]* 不以数字开头的文件 *[[:lower:]123] 文件名以小写字母结尾,或以 “1”,“2”,或 “3” 结尾的文件
-
Mkdir dirName // 创建目录
-
cp:复制文件 & 目录 copy // cp xxName .(复制到当前目录)
-
选项:
选项 意义 -a, --archive 复制文件和目录,以及它们的属性,包括拥有者和所有权。 通常情况下,文件拷贝具有执行拷贝操作的用户的默认属性。 -i, --interactive 在覆盖已存在文件之前,提示用户确认。如果这个选项不指定, cp 命令会默认覆盖文件。 -r, --recursive 递归地复制目录及目录中的内容。当复制目录时, 需要这个选项(或者 -a 选项)。 -u, --update 当把文件从一个目录复制到另一个目录时,仅复制 目标目录中不存在的文件,或者是文件内容新于目标目录中已经存在文件的内容的文件。 -v, --verbose 显示翔实的命令操作信息 -
例子:
命令 运行结果 cp file1 file2 复制文件 file1 内容到文件 file2。如果 file2 已经存在, file2 的内容会被 file1 的内容覆盖。如果 file2 不存在,则会创建 file2。 cp -i file1 file2 这条命令和上面的命令一样,除了如果文件 file2 存在的话,在文件 file2 被覆盖之前, 会提示用户确认信息。 cp file1 file2 dir1 复制文件 file1 和文件 file2 到目录 dir1。目录 dir1 必须存在。 cp dir1/* dir2 使用一个通配符,在目录 dir1 中的所有文件都被复制到目录 dir2 中。 dir2 必须已经存在。 cp -r dir1 dir2 复制目录 dir1 中的内容到目录 dir2。如果目录 dir2 不存在, 创建目录 dir2,操作完成后,目录 dir2 中的内容和 dir1 中的一样。 如果目录 dir2 存在,则目录 dir1 (和目录中的内容)将会被复制到 dir2 中。 -
mv:移动文件 or 重命名 move
- 选项:
-i --interactive 在覆盖一个已经存在的文件之前,提示用户确认信息。 如果不指定这个选项,mv 命令会默认覆盖文件内容。 -u --update 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新于目标目录相对应文件的内容的文件。 -v --verbose 当操作 mv 命令时,显示翔实的操作信息。 - 例子:
mv file1 file2 移动 file1 到 file2。如果 file2 存在,它的内容会被 file1 的内容覆盖。 如果 file2 不存在,则创建 file2。 这两种情况下,file1 都不再存在。 mv -i file1 file2 除了如果 file2 存在的话,在 file2 被覆盖之前,用户会得到 提示信息外,这个和上面的选项一样。 mv file1 file2 dir1 移动 file1 和 file2 到目录 dir1 中。dir1 必须已经存在。 mv dir1 dir2 如果目录 dir2 不存在,创建目录 dir2,并且移动目录 dir1 的内容到 目录 dir2 中,同时删除目录 dir1。如果目录 dir2 存在,移动目录 dir1(及它的内容)到目录 dir2 -
rm :删除文件 & 目录 remove
-i, --interactive 在删除已存在的文件前,提示用户确认信息。 如果不指定这个选项,rm 会默默地删除文件 -r, --recursive 递归地删除文件,这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。要删除一个目录,必须指定这个选项。 -f, --force 忽视不存在的文件,不显示提示信息。这选项覆盖了“–interactive”选项。 -v, --verbose 在执行 rm 命令时,显示翔实的操作信息。 痛苦案例:
-
ln: 创造链接(软硬皆可)
-
硬链接:最初 Unix 创建链接的方式,每个文件默认会有一个硬链接, 这个硬链接给予文件名字。
- 局限性1:不能关联另一磁盘上的文件(不能跨越物理设备)
- 局限性2:不能关联一个目录
-
符号链接:用于克服上面的局限性。有点类似win的快捷方式
- 坏链接:不指向任何东西。ls 命令会用不同颜色来展示坏链接
-
如何判断不同硬链接指向同一个文件?
-
ls -i 查看文件索引节点(图左方框;图右方框则是硬链接数量)
-
-
查看符号链接:第一个字符‘l’说明这是符号链接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RuA4K0AD-1659514250958)(/Users/fuweiyan/Library/Application Support/typora-user-images/image-20220802155921589.png)]
-
执行的大多数文件操作是针对链接的对象,而不是链接本身
-
-
第六章 使用命令
-
type commandName // 显示命令的类型
- which commandName // 显示一个可执行程序的位置
- 大型服务器中,常有不只安装可执行程序的一个版本的情况
- help commandName // 得到帮助文档
- 或者 commandName --help
- man 显示用户手册
-
alias 创建自己的命令
-
同一行可以写多个命令,用 ‘;’ 分开
-
创建新命令之前,可以用 type commandName 来确定是否已存在
-
alias name='xxName' // 新建别名 unalias xxName // 删除别名
-
命令行中定义alias,在shell会话结束后会消失。可以添加到文件中,每当开机就会建立
-
第七章 重定向
-
重定向:可以将命令的输入来源以及输出地点重定向为文件。也可以把多个命令连接起来组成一个强大的命令管道。
-
与 Unix 主题“任何东西都是一个文件”保持一致,像 ls这样的程序实际上把他们的运行结果输送到一个叫做标准输出的特殊文件(经常用 stdout 表示),而它们的状态信息则送到另一个叫做标准错误输出的文件(stderr)。默认情况下,标准输出和标准错误输出都连接到屏幕,而不是保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下, 标准输入连接到键盘。
-
I/O 重定向允许我们更改输出地点和输入来源。一般来说,输入来自键盘,输出送到屏幕。
但是通过 I/O 重定向,我们可以做出改变。
-
-
使用 “>” 重定向符后接文件名,将标准输出重定向到除屏幕以外的另一个文件
- 使用 “>” 重定向符来重定向输出结果时,目标文件总是从开头被重写
- 使用 “>>” 重定向符来重定向输出结果时,把重定向结果追加到文件内容后面,而不是从开头重写文件
-
标准输入、标准输出和标准错误输出,shell 内部分别将其称为文件描述符0、1和2
-
错误输出重定向:2>
ll > output.txt 2>&1 // 重定向标准错误输出到标准输出【 2>&1 】
标准错误输出的重定向必须总是出现在标准输出重定向之后(否则不起作用)
ll 2>&1 > output.txt // 反例
如今提供更精简合理的方法
ll &> output.txt // 【 &> 重定向stdout & stderr 】
-
数字存储桶:/dev/null 【接受输入,而且对输入不做任何处理】
-
-
cat 连接文件,也常被用于显示简短的文件
- 比如下载大型文件,分离成多个部分,如今要链接起来:movie.mpeg.001 movie.mpeg.002 …
cat movie.mpeg.0* > movie.mpeg // 连接成一个文件
-
重定向标准输入:<
-
管道:拥有将命令从标准输入读取数据,并输送到标准输出的能力 |
ll | less // 让less读取ll的输入,然后输出到控制台
-
过滤器:对数据完成复杂操作,几个命令放在一起组成一个管道线。
- Sort:排序
ls . /usr | sort | less // 加了一个sort作为过滤
- uniq:去重
ls . /usr | sort | uniq | less // 添加去重
-
wc: 行数、字数和字节数
wc README.md
-
grep:打印匹配行
grep能够匹配的模式可以很复杂
- -i:忽略大小写
- -v:只打印不匹配行
-
Head / tail - 打印文件头/尾
- -n 调整行数:head -n 5 README.md
-
tee: 从 Stdin 读取数据,同时输出到 Stdout 和文件(三通水管件)
第八章 Shell
-
花括号展开:从一个包含花括号的模式中创建多个文本字符串
echo AOC-{A,B,C} => AOC-A AOC-B AOC-C
- 逗号.
echo Nu-{1..5} Nu-1 Nu-2 Nu-3 Nu-4 Nu-5
- 花括号可以嵌套
-
命令替换:echo ${ls},允许把一个命令作为另一个命令的一部分来使用
-
展开和引用
第九章 快捷键
-
光标移动命令:
按键 行动 Ctrl-a 移动光标到行首。 Ctrl-e 移动光标到行尾。 Ctrl-k 剪切从光标位置到行尾的文本。 Ctrl-u 剪切从光标位置到行首的文本。
第十章 权限
-
Unix 多用户系统:多个用户可以在同一时间使用同一台计算机
-
ls -l 时,列表的前十个字符是文件的属性。这十个字符的第一个字符表明文件类型
- 一个普通文件 d 一个目录 l 一个符号链接。注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 c 一个字符设备文件。这种文件类型是指按照字节流来处理数据的设备。 比如说终端机或者调制解调器 b 一个块设备文件。这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘。
-
chmod: 更改文件或目录的权限,有两种表示法:八进制数字 & 符号
- 八进制表示法:举例 “ chmod 600 out.txt ”
Octal Binary File Mode 0 000 — 1 001 –x 2 010 -w- 3 011 -wx 4 100 r– 5 101 r-x 6 110 rw- 7 111 rwx -
符号表示法:
-
如果没有指定字符,则假定使用”all”。执行的操作可能是一个“+”字符,表示加上一个权限, 一个“-”,表示删掉一个权限,或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除。
-
优点:允许设置文件模式的某个属性,而不影响其他的属性。
-
举例:
u+x 为文件所有者添加可执行权限。 u-x 删除文件所有者的可执行权限。 +x 为文件所有者,用户组,和其他所有人添加可执行权限。 等价于 a+x。 o-rw 除了文件所有者和用户组,删除其他人的读权限和写权限。 go=rw 给文件所属的组和文件所属者/组以外的人读写权限。如果文件所属组或其他人已经拥有执行的权限,执行权限将被移除。 u+x,go=rw 给文件拥有者执行权限并给组和其他人读和执行的权限。多种设定可以用逗号分开。
-
u "user"的简写,意思是文件或目录的所有者。 g 用户组。 o "others"的简写,意思是其他所有的人。 a “all"的简写,是"u”, "g"和“o”三者的联合。 - passwd: 修改用户密码(要求为强密码)
第十一章 进程
-
系统启动 => 初始化内核活动为进程 => 运行 init 程序 => 运行 init 脚本
=》启动所有的系统服务(许多为守护线程)
-
系统分配给每个进程一个数字 => PID。
-
PID 号按升序分配,init 进程的 PID 总是1。
-
像文件一样,进程也有所有者和用户 ID,有效用户 ID,等等。
-
-
命令:
-
ps:process status,查看进程(快照)
ps // 比较少的信息 ps aux // 显示属于每个用户的进程信息
-
top: 动态查看进程
-
kill -9 pid: 终止进程
-