2020五一假期计划把这本书刷完,然后留下笔记,书籍扔掉。
Ch01 概述
- 层次:硬件系统 / Linux内核 / 用户进程
- 用户空间 / 内核空间
- 主内存:硬件系统中最重要的部分,内核的几乎所有操作都和主内存有关
- 内核:(1)管理进程(2)管理内存(3)操纵硬件设备(4)系统调用
- 一个进程让出CPU使用权给另一个进程称为上下文切换(context switch)。内核是在上下文切换时的时间段间隙中运行的(单核CPU)。
- fork(),exec()
推荐书目
- Operating System Concepts, 9th Edition (2012) 了解内核的详细工作原理
- Modern Operating Systems, 4th Edition (2014) 了解内核的详细工作原理
Ch02 基础命令和目录结构
标准输入输出
cat
,显示文件内容- 进程使用I/O流读写数据。进程从输入流中读取数据,向输出流写出数据。
- 输入流可以是文件、设备、终端或其他进程的输出流。按 ∧ + D 终止当前的标准输入流(stdin)并终止命令。
- 内核为每个进程提供一个标准输出流(stdout)供它们输出数据。很多命令如果你不为它们指定输入文件,它们就从标准输入获得数据。输出则不同,一部分命令将数据输出到标准输出,另一些可以将数据直接输出到文件。
⌘ > file
,将命令的执行结果输出到文件⌘ >> file
,将命令的执行结果加到文件末尾head /proc/cpuinfo | tr a-z A-Z
,使用管道字符|
,将一个命令的执行结果输出到另一个命令- 有时,即使重定向了标准输出,当发生错误时,终端屏幕还是会显示一些报错信息,这其实就是
标准错误输出
,是用来显示系统错误和调试信息的一种额外的输出流。$ ls /fffffff > f ls: cannot access '/fffffff': No such file or directory
- 可以用
2>
重定向标准错误输出,这里2
是由shell修改的流ID,1是标准输出,2是标准错误输出。比如:使用 > 向 f 发送标准输出,使用 >2 向 e 发送标准错误输出$ ls /fffffff > f 2> e
- 可以用
2>&1
将标准输出和标准错误输出重定向到同一个地方:$ ls /fffffff > f 2>&1
基础命令
ls
,显示指定目录的内容cp
,复制文件mv
,重命名文件、移动文件touch
,创建文件、更新已有文件的时间戳rm
,删除文件echo
,将它的参数显示到标准输出cd
,设置当前工作目录mkdir
,创建新目录rmdir
,删除空目录
shell可以使用通配符
匹配文件名和目录名
*
代表任意字符?
代表任意一个字符'*'
代表 * 本身
中间命令
grep
,显示文件和输入流中和参数匹配的行grep root /etc/passwd
,显示文件/etc/passwd中包含文本root的所有行grep root /etc/*
,显示目录/etc/中所有包含文本root的文件- 参数
-v
,反转匹配,显示所有不匹配的行 - 参数
-i
,不区分大小写 grep
支持正则表达式
less
,查看多屏内容pwd
,输出当前的工作目录名pwd -P
,符号链接通常很难获知当前目录的信息,可以用这个命令
diff
,查看两个文件之间的不同diff -u
,很多人喜欢用这个参数,因为这个输出格式能被许多自动化工具很好地识别
file
,显示文件格式信息find
,寻找文件locate
,寻找文件,在系统创建的文件索引中查找文件,查找更快,但对新创建的文件可能无效。head
和tail
,显示文件的前10行内容/最后10行内容- 可以用
-n
参数指定显示的行数
- 可以用
sort
,将文件内的所有行按照字母顺序排序-r
参数,反向排序
更改密码和shell
passwd
,更改密码chsh
,更改shell
环境变量shell变量
- shell中可以保存一些临时变量,称作
shell变量
,它们是一些字符值。用=
为shell变量赋值,比如:$ STUFF=blah
,将”blah”赋值给变量STUFF
,然后就可以使用$STUFF
来获得该变量的值,比如:$ echo $STUFF
)。 环境变量
与shell变量类似,但Unix系统中所有的进程都能访问环境变量,而shell变量只能被当前shell访问。环境变量可以通过export
命令来设置:$ STUFF=blah $ export STUFF
- 许多程序使用环境变量作为配置和选项信息。许多命令的帮助手册都有ENVIRONMENT一节,教你如何使用环境变量来设置该命令的参数和选项。
PATH
是一个特殊的环境变量,它定义了系统命令路径
。命令路径是一个系统目录列表,shell在执行一个命令时,会去这些目录查找这个命令。你可以设置PATH
变量,为shell查找命令加入更多的路径:$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 将路径dir加入到PATH的最前面,这样shell会先查找dir路径 $ PATH=dir:$PATH # 将路径dir加入到PATH的最后面,这样shell最后查找dir路径 $ PATH=$PATH:dir
命令行编辑
- ∧ + A,光标移动到行首
- ∧ + E,光标移动到行尾
- ∧ + W,删除前一个词
- ∧ + U,删除光标至行首的内容
- ∧ + K,删除光标至行尾的内容
- ∧ + Y,粘贴已删除的文本(例如粘贴∧+U所删除的内容)
- vi 或 Emacs 编辑器,二者选一个使用
查看帮助
man ls
,查看ls命令帮助信息man -k keyword
,如果你只知道某个功能,但是不知道命令名,可以通过关键字查找,比如查找排序有关的命令:$ man -k sort apt-sortpkgs (1) - Utility to sort package index files bunzip2 (1) - a block-sorting file compressor, v1.0.6 bzip2 (1) - a block-sorting file compressor, v1.0.6 comm (1) - compare two sorted files line by line sort (1) - sort lines of text files tsort (1) - perform topological sort
- 帮助手册按照命令类型被组织为很多个章节,章节编号出现在章节名后面的括号中,章节1(用户命令)、5(系统配置文件)、7(文件格式、规范和编码)和8(系统命令和服务器)是很好的补充参考。你可以按照序号来搜索章节,这样更精确:
$ man 5 passwd
- GNU 项目因为不喜欢帮助手册这种方式,引入了
info
。info文档内容更加丰富。有一些程序将它们的文档放到目录/usr/share/doc
中。
查看进程
ps
,每个进程都有一个数字ID,叫进程ID,可以用ps命令列出所有正在运行的进程x
选项,显示当前用户运行的所有进程ax
选项,显示系统当前运行的所有进程u
选项,显示更为详细的进程信息w
选项,显示命令的全名
kill pid
,终止进程kill -STOP pid
,暂停进程,kill -CONT pid
,继续执行进程&
操作符将进程设置为后台运行,比如:你要压缩一个很大文件,同时又不想干等执行结果:$ gunzip file.gz &
。
文件模式和权限
-rw-r--r-x
,[类型][用户权限][用户组权限][其他权限],r 文件可读,数字值4,w 文件可写,数字值 2,x 文件可执行,数字值 1;- 无权限,数字值 0。类型:-
-文件,d
-目录,l
-符号链接chmod
修改文件权限:chmod user1+r file
,chmod 644 file
- 目录也有权限,如果要列出目录内容,需要有读取权限,如果要访问目录中某个文件,需要有可执行权限。
umask
,设置文件的预定义的默认权限。符号链接
,是指向文件或目录的文件,相当于文件的别名。符号链接的类型是l
。符号链接仅仅是指向另一个名字的名字,所以所指向的目录不存在也没关系,直接访问会报错称目录不存在。ln -s target linkname
,创建符号链接。target 是指向的目标路径,linkname 是符号链接名称。注意这两个参数不要搞反了。
归档和压缩
- 具体内容请参考我写的另一篇文章:Linux Tar 简明教程
目录结构
/bin
,大部分基础的unix命令/dev
,设备文件/etc
,存放重要的系统配置文件,许多都是硬件系统的配置文件/home
,用户个人目录/lib
,供可执行程序使用的各种代码库。一般只有共享库。/proc
,通过一个可浏览的目录与文件接口来存放系统相关信息,比如当前运行的进程和内核信息/sys
,类似/proc,里面是设备和系统的信息/sbin
,可执行的系统文件,这些可执行文件用来管理系统,一般只有root用户才能运行。/tmp
,临时文件,所有用户都有读写权限。/usr
,存放着许多linux系统文件- /bin
- /lib
- /sbin1
- /include,C编译器需要使用的头文件
- /info,GNU帮助手册
- /local,管理员安装软件的地方
- /man,用户手册
- /share,存放Unix系统间的共享文件。
/var
,程序存放运行时信息,如系统日志、用户信息、缓存等。/boot
,内核加载文件。/opt
,存放第三方软件/media
,加载可移除设备
以超级用户的身份运行命令
- 普通用户使用
sudo
来以root用户身份执行命令,需要现在/etc/sudoers
文件中设置权限,比如:设置用户 user1 不用输入密码即可以超级用户身份运行命令:User_Alias ADMINS = user1 ADMINS ALL = NOPASSWD: ALL root ALL=(ALL) ALL
推荐书目
- The Linux ⌘ Line (2012),了解UNIX更多细节
- UNIX for the Impatient (1995),了解UNIX更多细节
- Learning the UNIX Operating System, 5th edition (2001),了解UNIX更多细节
- Mastering Regular Expression, 3rd edition (2006),学习正则表达式
- Programming Perl, 4th edition (2012) 中 the regular expression 一章,学习正则表达式
- Introduction to Automata Theory, Language, and Computation, 3rd edition (2006) 了解正则表达式的历史
- Learning the vi and Vim Editors: Unix Text Processing, 7th edition (2008),学习 vi 编辑器
- GNU Emacs Manual (2011),学习 Emacs 编辑器