本周学习了Linux Command Line and Shell Scripting Bible这本书的第一部分到第二部分。这里对一些我自己不熟悉的、我自己觉得比较重要的内容进行记录摘要。

1. 第一部分 linux命令行

1.3 bash shell基础命令

1.3.5 列出文件和目录

1.3.5.3 过滤输出列表

  • 模式匹配: 问号(?)代表任意单个字符; 星号(*)代表零个或多个字符。
  • 方括号代表单个字符位置并给出了该位置上的多个可能的选择。你可以将可能的字符逐一列出,也可以指定字符范围,比如字母范围[a–i]。
  • 还可以使用惊叹号(!)将不需要的内容排除在外。

1.3.6 处理文件

1.3.6.2 复制文件

  • cp 命令可以完成文件和目录从文件系统的一个位置复制到另一个位置的操作。
  • cp 命令最基本的用法需要两个参数,即源对象和目标对象:cp source destination。 当参数 source 和 destination 都是文件名时,cp 命令会将源文件复制成一个新的目标文件,并以 destination 命名。新文件在形式上就像全新的文件一样,有新的修改时间。
  • 如果目标文件已经存在,则 cp 命令 可能并不会提醒你这一点。最好加上-i 选项,强制 shell 询问是否需要覆盖已有文件。
  • cp 命令的-R 选项威力强大。可以用它在单个命令中递归地复制整个目录的内容。
  • 在执行 cp –R 命令之前,目录 NewDocuments 并不存在。它是随着 cp –R 命令被创建的, 整个 Documents 目录中的内容都被复制到其中。注意,新的 NewDocuments 目录中所有的文件都 有对应的新日期。NewDocuments 目录现在已经成了 Documents 目录的完整副本。

1.3.6.3 使用命令行补全

  • 制表键补全允许你在输入文件名 或目录名的时候,按一下制表键,让 shell 帮你将内容补充完整。
  • 使用制表键补全的技巧在于要给 shell 提供足够的文件名信息,使其能够将所需文件名与其 他文件名区分开。

1.3.6.4 链接文件

  • 链接是目录中指 向文件真实位置的占位符。在 Linux 中有两种类型的文件链接: 符号链接,硬链接。
  • 符号链接(也称为软链接)是一个实实在在的文件,该文件指向存放在虚拟目录结构中某个地方的另一个文件。这两个以符号方式链接在一起的文件彼此的内容并不相同。可以类比为windows系统中的快捷方式。
  • 要为一个文件创建符号链接,原始文件必须事先存在。使用 ln -s 命令创建符号链接。ln -s test_file slink_test_file
  • 硬链接创建的是一个独立的虚拟文件,其中包含了原始文件的信息以及位置。但是两者就根本而言是同一个文件。可以理解为“同一文件出现在不同的目录下”。要想创建硬链接,原始文件也必须事先存在,只不过这次使用 ln 命令时不需要再加入额外的选项了:ln test_file hlink_test_file

1.3.6.5 文件重命名

  • 重命名文件称为移动。mv 命令可以将文件和目录移动到另一个位置或是重新命名:mv old new

1.3.6.6 删除文件

  • rm的-i 选项会询问你是否真的要删除该文件。shell 没有回收站或者垃圾箱这样的东西, 文件一旦被删除,就再也找不回来了。所以在使用 rm 命令时,要养成总是加入-i 选项的好习惯。

1.3.7 管理目录

1.3.7.1 创建目录

  • 可以根据需要“批量”地创建目录和子目录。为此,要使用 mkdir 命令的-p 选项, mkdir 命令的-p 选项可以根据需要创建缺失的父目录。

1.3.8 查看文件内容

1.3.8.1 查看文件类型

  • file 命令是一个方便的小工具,能够探测文件的内部并判断文件类型

3.8.2 查看整个文件

  1. cat
  • cat 命令是显示文本文件中所有数据的得力工具。
  • -n 选项会给所有的行加上行号
  • 如果只想给有文本的行加上行号,可以用-b 选项
  1. more

  2. less

  • less实为 more 命令的升级版本
  • less 命令提供了多个非常实用的特性,能 够实现在文本文件中前后翻动,还有一些高级搜索功能。
  • less 命令还可以在完成整个文件的读取之前显示文件的内容。

1.3.8.3 查看部分文件

  1. tail 命令
  • tail 命令会显示文件最后几行的内容(文件的“尾部”)。在默认情况下,它会显示文件的 末尾 10 行。
  • 可以向 tail 命令中加入-n 选项来修改所显示的行数,如通过加入-n 2, 使得 tail 命令只显示文件的最后两行
  • tail 命令有一个非常酷的特性:-f 选项,该选项允许你在其他进程使用此文件时查看文件 的内容。tail 命令会保持活动状态并持续地显示添加到文件中的内容。这是实时监测系统日志 的绝佳方式。
  1. head 命令
  • head 命令会显示文件开头若干行(文件的“头部”)。在默认情况下,它会显示文件前 10 行的文本
  • head 命令也支持-n 选项
  • 这两个命令也允 许简单地在连字符后面直接输入想要显示的行数

1.4 更多的 bash shell 命令

1.4.1 监测程序

1.4.1.1 探查进程

  • ps 命令默认只显示运行在当前终端中属于当前用户的那些进程。
  • ps 命令的基本输出显示了程序的进程 ID(process ID,PID)、进程运行在哪个终端(TTY) 及其占用的 CPU 时间。
  • 如果需要查看系统中运行的所有进程,可以使用-ef 选项组合。-e 选项指定显示系统中运行的所有进程;-f 选项则扩充输出内容以显示一些有用的信息列:
列名 说明
UID 启动该进程的用户
PID 进程 ID
PPID 父进程的 PID(如果该进程是由另一个进程启动的)
C 进程生命期中的 CPU 利用率
STIME 进程启动时的系统时间
TTY 进程是从哪个终端设备启动的
TIME 运行进程的累计 CPU 时间
CMD 启动的程序名称
  • 如果还想获得更多的信息, 可以使用-l 选项,产生长格式输出。多出的那几列:
列名 说明
F 内核分配给进程的系统标志
S 进程的状态:
O - 正在运行
S - 休眠
R - 可运行,正等待运行
Z - 僵化,已终止但找不到其父进程
T - 停止
PRI 进程的优先级(数字越大,优先级越低)
NI 谦让度(nice),用于决定优先级
ADDR 进程的内存地址
SZ 进程被换出时所需交换空间的大致大小
WCHAN 进程休眠的内核函数地址
  • –forest 选项着实讨人喜欢。该选项能够使用 ASCII 字符来绘制可爱的图表以显示进程的层级信息

1.4.1.2 实时监测进程

  • top 命令也可以显示进程信息,但采用的是实时方式
  • 在默认情况下,top 命令在启动时会按照%CPU 值来对进程进行排序

1.4.1.3 结束进程

  • 在 Linux 中,进程之间通过信号来通信。
信号 名称 描述
1 HUP 挂起
2 INT 中断
3 QUIT 结束运行
9 KILL 无条件终止
11 SEGV 段错误
15 TERM 尽可能终止
17 STOP 无条件停止运行,但不终止
18 TSTP 停止或暂停,但继续在后台运行
19 CONT 在 STOP 或 TSTP 之后恢复执行
  • 在 Linux 中有两个命令可以向运行中的进程发出进程信号:kill 和 pkill。
  1. kill
  • kill 命令可以通过 PID 向进程发送信号, 遗憾的是,你只能使用进程的 PID 而不能使用其对应的程序名
  • 不服管教的进程通常会忽略这个请求。如果要强制终止, 则-s 选项支持指定其他信号(用信号名或信号值)。kill -9 PID
  1. pkill
  • pkill 命令可以使用程序名代替 PID 来终止进程,除此之外,pkill 命令 也允许使用通配符

1.4.2 监测磁盘空间

1.4.2.1 挂载存储设备

  • Linux 文件系统会将所有的磁盘都并入单个虚拟目录。在使用新的存储设备之前,需要将其放在虚拟目录中。这项工作称为挂载(mounting)。
  • 实际的物理存储设备通过驱动被抽象成 /dev/xxx 设备文件,用户不能直接用目录树访问它们。必须把它们挂载到虚拟文件系统(VFS)的某个挂载点之后,才能以统一的方式访问和管理。
  1. mount
  • 用于挂载存储设备的命令叫作 mount。在默认情况下,mount 命令会输出当前系统已挂载 的设备列表。
  • 如果知道设备分区使用的文件系统类型,可以使用-t <fs-type>过滤输出。
  • mount 命令提供了 4 部分信息: 设备文件名, 设备在虚拟目录中的挂载点, 文件系统类型, 已挂载设备的访问状态
  • 手动挂载设备的基本命令: mount -t type device directory, type 参数指定了磁盘格式化所使用的文件系统类型。示例: mount -t vfat /dev/sdb1 /media/disk
  • -o 选项允许在挂载文件系统时添加一系列以逗号分隔的额外选项, 如:
选项 说明
ro 以只读形式挂载
rw 以读写形式挂载
user 允许普通用户挂载该文件系统
check=none 挂载文件系统时不执行完整性校验
loop 挂载文件
  1. umount
  • 移除可移动设备时,不能直接将设备拔下,应该先卸载。
  • umount 命令的格式非常简单: umount [directory | device ]

1.4.2.2 使用 df 命令

  • 有时需要知道在某台设备上还有多少磁盘空间。df 命令可以方便地查看所有已挂载磁盘的使用情况
  • df 命令会输出内核挂载的所有虚拟文件系统,因此可以使用-t 选项来指定文件系统类型
  • 该命令的输出: 设备文件位置, 包含多少以 1024 字节为单位的块, 使用了多少以 1024 字节为单位的块, 还有多少以 1024 字节为单位的块可用, 已用空间所占的百分比, 设备挂载点
  • 常用选项之一是-h,该选项会以人类易读(humanreadable)的形式显示磁盘空间,通常用 M 来替代兆字节,用 G 来替代吉字节

1.4.2.3 使用 du 命令

  • du 命令可以显示某个特定目录(默认情况下是当前 目录)的磁盘使用情况。
  • 下面这些选项能让 du 命令的输出更加清晰易读。
    • -c:显示所有已列出文件的总大小。
    • -h:按人类易读格式输出大小,分别用 K 表示千字节、M 表示兆字节、G 表示吉字节。
    • -s:输出每个参数的汇总信息。

1.4.3 处理数据文件

1.4.3.1 数据排序

  • 处理大量数据时的一个常用命令是 sort。这是用来对数据进行排序的命令。
  • 在默认情况下, sort 命令会依据字典序来对文本文件中的数据行进行排序。
  • 使用-n 选项告诉 sort 命令将数字按值排序
  • 加入-M 选项,那么 sort 命令就能识别三字符的月份名并正确排序
  • -r –reverse 逆序排序(升序变成降序)
  • -c –check 不排序,但检查输入数据是否有序,无序的话就报告
  • -u –unique 和-c 选项合用时,检查严格排序;不和-c 选项合用时,相同行仅输出一次
  • 在对按字段分隔的数据进行排序时,-k 选项和-t 选项非常方便。 先使用-t 选项指定字段分隔符,然后使用-k 选项指定排序字段(从1开始)。示例:sort -t ':' -k 3 -n /etc/passwd

1.4.3.2 数据搜索

  • grep [options] pattern [file]
  • 如果要进行反向搜索(输出不匹配指定模式的行),可以使用-v 选项
  • 如果要显示匹配指定模式的那些行的行号,可以使用-n 选项
  • 如果只想知道有多少行含有匹配的模式,可以使用-c 选项

1.4.3.3 数据压缩

  • gzip 命令会压缩命令行中指定的文件。也可以指定多个文件名或是用通配符来一次性压缩多个文件,压缩后的文件会在原文件名后面添加 .gz 扩展名。
  • 要解压缩文件,可以使用 gunzip 命令,或者使用 gzcat 命令来查看压缩文件的内容。

1.4.3.4 数据归档

  • gzip 命令只能压缩文件,要压缩一个文件夹,需要先归档。

  • 归档工具是 tar 命令tar function [options] object1 object2 ...

  • 常用function: -c –create 创建新的 tar 归档文件 -t –list 列出 tar 归档文件的内容

  • 常用option: -f file 将结果输出到文件(或设备)

  • tar -cf test.tar test/ test2/该命令创建了一个名为 test.tar 的归档文件, 包含目录 test 和 test2 的内容。

  • tar -tf test.tar 该命令列出了(但不提取)tar 文件 test.tar 的内容。

  • tar -xvf test.tar 该命令从 tar 文件 test.tar 中提取内容。如果创建的时候 tar 文件含有目录结构,则在当前目录中重建该目录的整个结构。

  • 在下载开源软件时经常会看到文件名以.tgz 结尾,这是经 gzip 压缩过的 tar 文件,可以用 tar -zxvf filename.tgz 来提取其中的内容。

  • tar 命令的操作

操作 长选项 描 述
-A –concatenate 将一个 tar 归档文件追加到另一个 tar 归档文件末尾
-c –create 创建新的 tar 归档文件
-d –diff 检查归档文件和文件系统的不同之处
–delete 从 tar 归档文件中删除文件
-r –append 将文件追加到 tar 归档文件末尾
-t –list 列出 tar 归档文件的内容
-u –update 将比 tar 归档文件中已有的同名文件更新的文件追加到该归档文件
-x –extract 从 tar 归档文件中提取文件
  • tar 命令选项
选项 描述
-C dir 切换到指定目录
-f file 将结果输出到文件(或设备)
-j 将输出传给 bzip2 命令进行压缩
-J 将输出传给 xz 命令进行压缩
-p 保留文件的所有权限
-v 在处理文件时显示文件名
-z 将输出传给 gzip 命令进行压缩
-Z 将输出传给 compress 命令进行压缩

1.5 理解 shell

1.5.3 理解外部命令和内建命令

1.5.3.2 内建命令

  1. 使用命令别名
  • alias 命令是另一个实用的 shell 内建命令。命令别名允许为常用命令及其参数创建另一个名称,从而将输入量减少到最低。alias alias-name=origin
  • 因为命令别名属于 内建命令,所以别名仅在其被定义的 shell 进程中才有效。

1.6 Linux 环境变量

1.6.1 什么是环境变量

  • bash shell 中有两种环境变量: 全局变量, 局部变量。

1.6.1.1 全局环境变量

  • 全局环境变量对于 shell 会话和所有生成的子 shell 都是可见的。局部环境变量则只对创建它 的 shell 可见。
  • 可以使用 env 命令或 printenv 命令来查看全局变量
  • 使用 echo 命令显示某个变量的值。在引用某个环境变量时,必须在该变量名前加上美元 符号($)

1.6.2 设置用户自定义变量

1.6.2.1 设置局部用户自定义变量

  • 使用等号为变量赋值,值可以是数值或字符串 my_variable=Hello
  • 如果用于赋值的字符串包含空格,则必须用单引号或双引号来界定该字符串的起止
  • 在变量名、等号和值之间没有空格。如果在赋值表达式中加上了空 格,那么 bash shell 会将值视为单独的命令

1.6.2.2 设置全局环境变量

  • export my_variable=value

1.6.3 删除环境变量

  • 删除已有的环境变量。可以用 unset 命令来完成这 个操作。在 unset 命令中引用环境变量时,记住不要使用$。
  • 如果要用到(doing anything with)变量,就使用$;如果要操作(doing anything to)变量,则不使用$。
  • 对于 PATH 变量的修改只能持续到退出或重启系统。这种效果并不能一直奏效。

1.6.6 定位系统环境变量

  • 当你登录 Linux 系统启动 bash shell 时,默认情况下 bash 会在几个文件中查找命令。这些文件 称作启动文件或环境文件。

1.6.6.1 登录 shell

  • 登录 shell 通常会从 5 个不同的启 动文件中读取命令。
    • /etc/profile
    • $HOME/.bash_profile
    • $HOME/.bashrc
    • $HOME/.bash_login
    • $HOME/.profile
  • /etc/profile 文件是系统中默认的 bash shell 的主启动文件。系统中的每个用户登录时都会执行这个启动文件。
  • 其余的启动文件都用于同一个目的:提供用户专属的启动文件来定义该用户所用到的环境 变量。大多数 Linux 发行版只用这 4 个启动文件中的一两个。
  • 在大多数发行版中,保存个人用户永久性 bash shell 变量的最佳地点是$HOME/.bashrc 文件。
  • 可以把个人的 alias 设置放在$HOME/.bashrc 启动文件中,使其效果永久化。

1.7 理解 Linux 文件权限

1.7.3 理解文件权限

image.png

1.7.3.2 默认文件权限

  • 使用3位8进制数来表示权限。
权限 二进制值 八进制值 描述
000 0 没有任何权限
–x 001 1 只有执行权限
-w- 010 2 只有写入权限
-wx 011 3 有写入和执行权限
r– 100 4 只有读取权限
r-x 101 5 有读取和执行权限
rw- 110 6 有读取和写入权限
rwx 111 7 有全部权限(读取、写入和执行)
  • umask 命令用来设置新建文件和目录 的默认权限
  • umask 值只是个掩码, 把 umask 值从对象的全权限值(full permission)中减掉。对文件而言,全权限值是 666 (所有用户都有读取和写入的权限);对目录而言,全权限值则是 777(所有用户都有读取、写入 和执行权限), 结果就是新建的文件或目录的权限。
  • 文件不能直接执行。新建文件是普通数据(文本、配置、源码等),不是程序。因此全权限为666
  • 必须要有 x 权限才能进入目录,否则你即使有 r 也只能列出文件名,看不到内容。

1.7.4 更改安全设置

1.7.4.1 修改权限

  • chmod 命令可以修改文件和目录的安全设置。chmod options mode file
  • mode 参数允许使用八进制模式(推荐)或符号模式来进行安全设置。

1.9 安装软件

1.9.1 软件包管理基础

  • 软件包存储在称为仓库(repository)的服务器上,可以利用本地 Linux 系统中的软件包管理 器通过 Internet 访问,在其中搜索新的软件包,或是更新系统中已安装的软件包。

1.9.2 基于 Debian 的系统

  • apt [options] command

1.9.2.1 使用 apt 管理软件包

  • apt list 命 令会显示仓库中所有可用的软件包,如果再加入–installed 选项,就可以限制仅输出那些已安装在系统中的软件包
  • 如果已经知道系统中的某个软件包,希望显示其详细信息,可以使用 show 命令来操作: apt show package_name
  • apt show 命令并不会指明软件包是否已经安装。它只根据软件仓库显示该软件包的详细信息。

1.9.2.2 使用 apt 安装软件包

  • 查找特定的软件包: apt search package_name
  • search 命令的妙处在于不需要在 package_name 周围添加通配符,直接就有通配符的效果。
  • 如果只想搜索软件包名称,可以加入–name-only 选项。
  • 安装:apt install package_name
  • 可以使用 list 命令的–installed 选项检查安装是否正确。如果在输出中看到了软件包, 那么说明已经安装好了。

1.9.2.3 使用 apt 升级软件

  • upgrade 命令可以使用仓库中的任何新版本安全地升级系统中所有的软件包: apt upgrade
  • upgrade 命令在升级过程中不会删除任何软件包。如果必须删除某个软件包才能完成升级, 可以使用以下命令: apt full-upgrade

1.9.2.4 使用 apt 卸载软件包

  • apt 的 remove 命令可以删除软件包,同时保留数据和配置文件。如果要将软件包以及相关 的数据和配置文件全部删除,那么需要使用 purge 命令
  • 如果确定有依赖关系的软件包不会再有他用,可以使用 autoremove 命令将其删除

1.9.4 使用容器管理软件

  • 云计算带来了应用程序打包方式的一种新范式:应用程序容器(application container)。应用 程序容器创建了一个环境,其中包含了应用程序运行所需的全部文件,包括运行时库文件。开发 人员随后可以将应用程序容器作为单个软件包分发,保证能够在任何 Linux 系统中正常运行。

1.9.4.1 使用 snap 容器

  • 使用 snap 命令行工具查询 snap 数据库,显示已安装的 snap 包,以及安装、升级和删除 snap 包。
  • snap list 命令查看当前已安装的 snap 应用程序列表
  • snap find 命令可以在 snap 仓库中搜索指定程序
  • snap info 命令可以查看 snap 应用程序(简称为 snap)的详细信息
  • snap install 命令可以安装新的 snap
  • 如果需要删除某个 snap,使用 snap remove 命令即可
  • Snap vs APT 的区别
特性 APT (Deb 包) Snap 包
软件形式 .deb .snap
依赖管理 使用系统库,依赖需要由 APT 解决 自带依赖,几乎无需外部依赖
安装来源 Debian/Ubuntu 官方仓库 或 PPA Snap Store(集中式)
升级机制 由系统包管理器统一升级 Snapd 后台自动滚动更新
运行环境 与系统环境强耦合 运行在容器化沙盒中
体积大小 通常较小(共用系统库) 较大(自带依赖)
安全性 依赖系统级安全机制 自带沙盒隔离,更细粒度权限控制
启动速度 快,直接使用系统库 稍慢,需通过 snapd 启动环境
典型应用 系统级工具、传统软件 桌面应用、跨发行版的程序

TO BE CONTINUED