《Linux命令行与Shell脚本编程大全第2版》读书笔记

时间:2020-11-28 02:53:43

公司说不准用云笔记了,吓得我赶紧把笔记贴到博客上先。。。。。

近3年前的了,只有一半的章节,后面的没空记录了。。。。


第1章

可以cat /proc/meminfo文件来观察Linux系统上虚拟内存的当前状态
ipcs命令专门用来查看系统上的当前共享内存页面
Ubuntu使用一个表来管理在系统开机时要自动启动的进程,在/etc/init.d目录,可将开机时启动或停止某个应用的脚本放在这个目录下。这些脚本通过/etc/rcX.d目录下的入口启动,这里X代表运行级(run level)
Linux才做系统有5个启动运行级。运行级为1时,只有基本的系统进程会启动,同时会启动唯一一个控制台终端进程。我们称之为单用户模式。单用户模式通常用来在系统有问题时进行紧急的文件系统维护。
标准的启动运行时3。在这个运行级上,大多数应用软件都会启动。另一个Linux中常见的运行级是5。在这个运行级上系统会启动图形化的X Window系统,同时允许用户通过图形化桌面窗口系统登录系统。
linux系统将硬件设备当成特殊的文件,称为设备文件。有3种不同的分类:字符型设备文件、块设备文件和网络设备文件。

第3章

bash shell启动时会自动处理用户主目录下.bashrc文件中的命令。
用man bash可以查看bash的手册
Linux将文件存储在单个目录结构中,这个目录称之为虚拟目录(virtual directory)。虚拟目录包含了安装在PC上的所有存储设备的文件路径,并将其并入到一个目录结构中。 / 为根(root)目录
Linux PC上安装的第一块硬盘为根驱动器,它包含了虚拟目录的核心。Linux会在根驱动器上创建一些特别的目录,称之为挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然而实际上他们却存储在另外一个驱动器中。
/ 虚拟目录的根目录,通常不会在这里存储文件
/bin 二进制目录,存放许多GNU用户级的工具
/boot 启动目录,存放启动文件
/dev 设备目录,Linux在这里创建设备节点
/etc 系统配置文件目录
/home 主目录,linux在这里创建用户目录
/lib 库目录,存放系统和应用程序的库文件
/media 媒体目录,存放可移动媒体设备挂载点的地方
/mnt 挂载目录,另一个存放可移动媒体设备挂载点的地方
/opt 可选目录,通常用于存放可选的软件包
/root 根主目录
/sbin 系统二进制目录,存放许多GNU管理员级工具
/tmp 临时目录,可以在该目录中创建和删除临时工作文件
/usr 用户安装软件的目录
/var 可变目录,用以存放经常变化的文件,比如日志文件
在安装支持彩色的终端模拟器,可用带
-F参数的ls命令来区分文件和目录,目录名后会增加正斜线(/),会在可执行文件后加个星号。
把隐藏文件一起显示,用-a参数。
-R会遍历输出子目录和所有文件。
-l参数在每一行列出单个文件和目录。每一行都包含下列信息:
文件类型,比如目录(d),文件(-),字符型文件(c)或块文件(b)
文件的权限
文件的硬链接总数
文件属主的用户名
文件属组的组名
文件的大小(以字节为单位)
文件上次修改时间
文件名或目录名
可用通配符过滤:
问号代表一个字符,可用在过滤器字符串中替代任意位置的单个字符
星号代表零个或多个字符
(通配符和正则表达式不是一回事)
可以用touch命令创建空文件,还可用来改变已有文件的访问时间和修改时间,而不改变文件的内容。
如果只改变访问时间,可用-a参数。如果只改变修改时间,可用-m参数。默认情况下,touch使用当前时间。可以通过-t参数加上特定的时间戳来指定时间
cp用于复制
-a 归档文件,并保留他们现有的属性
-b 创建已存在目标文件的备份,而非覆盖它
-d 保留
-f 强制覆盖已有的目标文件,不提示
-i 在覆盖目标文件之前提示
-l 创建文件链接而非复制文件
-p 如果可能,保留文件属性
-r 递归地复制文件
-R 递归地复制目录
-s 创建一个符号链接而非复制文件
-S 覆盖默认的备份文件的后缀(默认是~)
-u 仅在源文件比目标文件新的情况下复制(相当于更新)
-v 详细模式,解释到底发生了什么
-x 仅限于当前文件系统的复制
如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本或多个虚拟副本的方法。这种虚拟的副本就成为链接。Linux有两种不同类型的文件链接:
符号链接,即软链接
硬链接。硬链接会创建一个独立文件,其中包含了源文件的信息以及位置。引用硬链接文件等同于引用了源文件。
硬链接在ls -l中会显示相同的索引节点号,表明实际上它们是同一个文件。软链接的索引节点号不同,而且文件大小也不同,也就是一个新文件。
可用ln命令来替代cp命令。默认情况下,ln命令会创建硬链接。加-s参数创建软链接
mv(moving)命令用来移动文件和重命名。移动一个有软链接指向它的文件,软链接将失效。
rm(removing)命令是删除文件。bash shell中没有回收站或者垃圾箱,所以文件一旦删除就无法再找回了。
文件test1含有一个指向它的硬链接test4和一个指向它的软链接test5,而它被删除后,两个链接文件依然都在。查看硬链接test4的内容时能显示文件内容,而查看软链接test5文件的内容时,bash表明它已经不存在了。硬链接文件采用和源文件相同的索引节点号。硬链接会一直维持这个索引节点号来保留数据,直到你删除了最后一个硬链接它的文件。所有的软连接文件都知道它所指向的文件不在了,所以指向的也就是一个无效文件。
可以用-f参数来强制删除文件而不会被提示符烦到。
mkdir命令创建目录
rmdir命令删除空目录。可以使用--ignore-fail-on-non-empty参数来删除非空目录。
也可用rm -r来递归地删除目录中的文件,最后删除目录自身。-rf可无条件删除
stat命令可以提供文件系统上某个文件的所有状态信息
file命令用来查看文件类型,能够探测文件的内部并决定文件时什么类型。file命令将文件分成3类:
文本文件:包含可打印字符的文件
可执行文件:可在系统上运行的文件
数据文件:包含不可打印二进制文件、又不能在系统上运行的文件
cat用于查看文件
-n 给所有的行加上行号
-b 给有文本的行加上行号
-s 将多个空白行压缩到单个空白行
more命令会显示文本文件的内容,但会在显示每业数据之后停下来。有很多选项可使用
less命令是more的升级版,(文件游戏,less is more)。
tail命令会显示文件末尾部分的内容,默认会显示末尾10行。
-c byte 显示文件最后的bytes个字节的字符
-n lines 显示文件最后的lines行
-f 让tail程序一直保持活动状态,如果有新的内容加到文件的末尾就显示出来
--pid=PID 和-f参数一起,跟踪一个文件直到进程ID为PID的进程结束
-s sec 和-f参数一起,在每次循环输出之间休眠sec秒
-v 总是显示带文件名的头
-q 从不显示带文件名的头
-f参数是tail命令的一个突出的特性,它允许你在其他进程使用该文件时查看文件的内容。tail命令会保持活动状态并不断添加到文件的内容。这是实时监测系统日志的绝妙方式。
head命令会显示文件开头那些行的内容,默认显示文件前十行的文本。head命令是不知道文件内容而想知道大致内容时的利器。

第4章

ps监测进程(process)。输出内容中每列的意义还需要查查man
-e 显示所有进程
-f 显示更多额外输出
-F 比-f显示更多额外输出
-l 长格式输出
top命令实时显示进程信息
Linux沿用了Unix进行进程间通信的方法。在Linux上,进程之间通过信号来通信。进程的信号就是预定义好的一个消息,进程能识别它并决定忽略还是作出反应
信号   名称   描述
1  HUP  挂起
2  INT  中断
3  QUIT 结束运行
9  KILL 无条件终止
11 SEGV 段错误
15 TERM 尽可能终止
17 STOP 无条件停止运行,但不终止
18 TSTP  停止或暂停,但继续在后台运行
19  CONT 在STOP或TSTP之后恢复运行
在linux上有两个命令可以向运行中的进程发出进程信号,kill命令和killall命令
kill命令可通过PID(进程号)给进程发信号。默认情况下,kill命令会向命令行中列出的全部PID发送一个TERM信号。要发送进程信号,你必须是进程的属主或登录为root用户。
如果要强制终止,-s参数支持指定其他信号(用信号名或信号值),如kill -s HUP 3940
killall命令支持通过进程名而不是进程号来结束进程,并支持通配符。
mount命令会输出当前系统上挂载的设备列表,并可使用参数来手动挂载设备
umount命令卸载可移动设备
sort命令用来对数据进行排序
默认情况下,会把数字当做字符而执行标准的字符排序。可用-n参数把数组识别成数字而不是字符
-k=POS1[,POS2] 排序从POS1位置开始;如果指定了POS2的话,到POS2位置结束
-t=SEP 指定一个用来区分键位置的字符
压缩数据的工具 文件扩展 描述
bzip2  .bz2  采用Burrows-Wheeler块排序文本压缩算法和霍夫曼编码
compress  .Z  原始的Unix文件压缩工具,逐渐消失中
gzip  .gz  GNU压缩工具,用Lempel-Ziv编码
zip  .zip  Windows上PKZIP工具的Unix实现
Unix和Linux上最广泛使用的归档工具是tar命令。格式
tar function [options] object1 object2
function参数定义了tar命令应该做什么
功能  全字名称  描述
-A  --concatenate  将一个已有tar归档文件追加到另一个tar归档文件
-c  --create  创建一个新的tar归档文件
-d  --diff  检查归档文件和文件系统的不同之处
     --delete  从已有tar归档文件中删除
-r  --append  追加文件到已有tar归档文件末尾
-t  --list  列出已有tar归档文件的内容
-u  --update  将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
-x  --extract  从已有tar归档文件中提取文件
选项:
-C dir  切换到指定目录
-f file  输出结果到文件或设备file
-j  将输出重定向给bzip2命令来压缩内容
-p  保留所有文件权限
-v  在处理文件时显示文件
-z  将输出重定向给gzip命令来压缩内容
这些选项经常合并到一起使用。可以用
tar -cvf test.tar test/ test2/
来创建一个归档文件,用
tar -xvf test.tar
来提取内容。
gzip压缩过的tar文件是以.tgz结尾,可用
tar -zxvf filename.tgz来解压

第5章

bash shell用一个称作环境变量(environment variables)的特性来存储有关shell会话和工作环境的信息。
printenv命令查看所有全局变量
set命令会显示特定进程设置的所有环境变量,包括全局和局部环境变量
全局环境变量在设定该全局环境变量的进程创建的所有子进程中都是可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出export到全局环境中。
unset命令删除环境变量。在unset命令引用环境变量时,记住不要用美元符号$
bash shell提供了跟Unux Bourne shell兼容的环境变量:
变量  描述
CDPATH  冒号分隔的目录列表,作为cd命令的搜索路径
HOME 当前用户的主目录
IFS shell用来分隔文本字符串的一列字符
PATH  冒号分隔的shell查找命令的目录列表
除了默认的Bourne的环境变量,bash shell还提供了一些自有的变量。(不只下列这些)
变量  描述
BASH  运行当前shell示例的全路径名
BASH_ARGC  含有传给子函数或shell脚本的参数总数的可变数组
BASH_ARGV  含有传给子函数或shell脚本的参数的可变数组
BASH_COMMAND  shell正在执行的命令或马上就执行的命令
BASH_CMDS  shell执行过的命令的所在位置的关联数组
BASHPID  当前bash进程的PID
COLUMNS  当前bash shell实例所用终端的宽度
PPID  bash shell父进程的PID
PWD  当前工作目录
OLDPWD  shell之前的工作目录
可以修改PATH=$PATH:mypath,程序员通常用的办法是将单点符也加到PATH环境变量里。
启动bash shell有三种方式,登录时当做默认登录shell,作为非登录shell的交互式shell,作为运行脚本的非交互shell
登录shell会从4个不同的启动文件里读取命令,依次是(Ubuntu有不同):
/etc/profile
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
其中/etc/profile是熊上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件,另外三个是用户专有的。
.bash_profile启动文件会先去检查HOME目录中是不是还有另一个叫.bashrc的启动文件。如果有,会先去执行它里面的命令
数组是能够存储多个值的变量。值可按单个值或整个数组来引用。
mytest=(one two three four five)   定义数组
echo $mytest     显示第一个值
echo ${mytest[2]}     显示第3个值
echo ${mytest[*]}    显示所有的值
mytest[2]=seven   赋值
alias命令创建别名, 可用-p参数打印已有的别名列表

第6章

useradd 添加新用户
userdel 删除用户
groupadd 添加新组
groupdel 删除
ls -l输出结果的第一个字段是描述文件和目录权限的码。这个字段的第一个字符代表了对象的类型
-代表文件
d代表目录
l代表链接
c代表字符型设备
b代表块设备
n代表网络设备
之后有3组三字符的码,每一组字符码表示三重访问权限:
r代表对象是可读的
w代表对象是可写的
x代表对象是可执行的
如果没有权限,在该权限位会出现单破折线。这3组三字符码分别对应对象的3个安全级别:
对象的属主
对象的属组
系统其他用户
umask命令用来设置用户创建文件和目录的默认权限,即设置后,touch命令会默认用这个权限创建文件。
umask命令可以显示这个默认权限,为0022
这4个数字,第一位代表了一项特别的安全特性,叫做粘着位(sticky bit),后面的3位表示文件或目录的umask的八进制值。
八进制模式的安全性设置先获取这3组rwx权限的值,然后将其转换成3位二进制值来表示一个八进制值。在这个二进制表示中,每个位置代表一个二进制位。因此,如果读权限是唯一置位的权限,权限值就是r--,转换成二进制值就是100,代表的八进制值是4.
权限  二进制值  八进制值
---   000   0
00x  001  1
-w-  010  2
-wx  011  3
r--  100  4
r-x  101  5
rw-  110  6
rwx  111 7
umask值是个掩码,它会屏蔽掉不想授予该安全级别的权限。
chmod命令用来改变文件和目录的安全性设置。格式如下:
chmod options mode file
mode参数后可跟八进制模式或符号模式来设置安全性设置。
八进制模式: chmod 755 file
符号模式下的格式:
[ugoa...][+-=][rwxXstugo...]
u代表用户,g代表组,o代表其他,a代笔所有。
X:如果对象是目录或者它已有执行权限(3个组中有一个是x),赋予执行权限
s:运行时重新设置UID或GID
t:保留文件或目录
u:将权限设置为跟属主一样
g:将权限设置为根属组一样
o:将权限设置为跟其他用户一样
chown命令用来改变文件的属主,chgrp命令用来改变文件的默认属组。

第8章

包管理系统(Package Management System, PMS),利用一个数据库来记录:系统上已安装了什么软件包,每个包安装了什么文件,每个已安装软件包的版本。还有一些用来安装、管理和删除软件用的命令行工具。
dpkg命令是基于Debian系PMS工具的核心。包含在这个PMS中的其他工具有:
apt-get
apt-cache
aptitute
到目前为止,最常用的命令行工具是aptitude,而这是有原因的。aptitude工具本质上是apt工具和apkg的前端。dpkg是一个软件包管理系统工具,而aptitude则是一个完整的软件包管理系统。
在shell提示符下键入aptitude并按下回车键,会且到aptitude的全屏模式(交互式界面)。
aptitude show package_name 显示某个特定包的详细信息
dpkg -L package_name 显示所有跟某个特定包关联的所有文件的列表
dpkg --search absolute_file_name 查找某个特定文件属于哪个软件包,注意用绝对文件路径
aptitude search package_name 查找特定的软件包。会隐式添加通配符到包名。在结果中,每个包名字之前都有一个p或一个i。i说明已经安装,p说明还没安装。还可能有u,可以升级。
aptitude safe-upgrade 安全地用软件库中的新版本更新系统上所有的软件包
aptitude full-upgrade 或 aptitude dist-upgrade 与safe-upgrade的区别是不会检查包与包之间的依赖关系
aptitude remove 只删除软件包但不删除数据和配置文件。之后在用aptitude search会看到软件包名称前有个c,表示软件已被删除,但配置文件尚未从系统中清除。
aptitude purge 删除软件包和相关的数据和配置文件

第10章

创建shell脚本文件时,必须在文件的第一行指定要使用的shell,其格式为:
#!/bin/bash
echo命令可用单引号或双引号来将文本字符串圈起来。如果你在字符串中用到了它们,你需要在文本中使用其中一种引号,而用另外一种来将字符串圈起来
echo -n 输出字符串后不换行
要显示美元符,在前面放置一个反斜线 \$
用户变量可以是任何不超过20个字母、数字或下划线的文本字符串,区分大小写。
反引号允许你将shell命令的输出赋给变量。 例如var=`date`
date +%y%m%d%H%M%S 输出年月日时分秒
大于号(>)输出重定向,会创建文件,如果已存在则覆盖
双大于号(>>)追加数据
wc命令提供了对数据中文本的计数。默认输出3个值,文本的行数,文本的词数,文本的字节数
内联输入重定向(inline input redirection),允许在命令行而不是在文件输入重定向的数据。符号是双小于号(<<),除了这个符号,必须指定一个文本标记来划分要输入数据的开始和结尾。你可以用任何字符串的值来作为文本标记,但在数据的开始和结尾必须一致。例如:
wc <<EOF
test line 1
test line 2
EOF
管道将一个命令的输出重定向到另一个上。不要以为管道链接会一个一个地运行,实际上会同时运行这两个命令,在系统内部将他们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。传输数据不会用到任何中间文件或缓冲区域。