Linux · 2023-10-30 0

《Linux命令行与shell脚本编程大全》读书笔记01

第三章 bash shell 基础命令

3.3 与bash手册交互

man

使用 man <命令名> 查找某命令的手册页,作为快速参考

空格翻页,enter逐行查看,q键退出

3.4 浏览文件系统

3.5 列出文件和目录

ls

-F:区分目录和文件 /为目录 *为可执行文件 -a:显示隐藏文件 -R:递归列出当前目录与子目录中的文件 -l:显示文件详细信息

3.6 处理文件

touch <filename> 创建文件

创建空文件,更改文件时间戳

cp <source> <destination> 复制文件

-i 强制shell询问是否需要覆盖已有文件 -R 递归复制整个目录的内容

<source> <destination>都既可以表示目录,也可以表示文件 若为目录建议在目录名后加”/”,并推荐使用相对路径

链接文件

软链接(符号链接)

使用命令ln -s

硬链接

使用命令ln

hlink_test1 和 test1 根本而言是同一个文件

mv 移动/重命名文件

-i 强制shell询问是否需要覆盖已有文件

rm 删除文件

-i 询问是否要删除文件 -f 强制删除

3.7 管理目录

mkdir 创建目录

-p 批量创建目录和子目录

rmdir 删除目录

默认只能删除空目录

一口气删除目录树: rm -rf (慎用)

3.8 查看文件内容

file 查看文件类型

查看整个文件

cat more less

查看部分文件

tail 显示文件最后几行(默认10行)
head 显示文件开头几行(默认10行)

使用-n指定行数

第四章 更多的bash shell命令

4.1 监测程序

ps 探查进程

常用:ps -ef 显示系统中的所有进程并扩充内容

只能显示某一特定时间点的信息

   
UID 启动该进程的用户
PID 进程ID
PPID 父进程的PID
C 进程生命周期的CPU利用率
STIME 进程启动时的系统时间
TTY 进程是从哪个终端设备启动的
TIME 运行进程的累计CPU时间
CMD 启动的程序名称

top 实时监测进程

结束进程 : kill pkill

kill <PID> -s 强制终止 检查kill命令是否生效,可再次执行ps top命令

pkill <进程名> 支持通配符

4.2 监测磁盘空间

挂载存储设备

mount 默认输出当前系统已挂载的设备列表,较新版本的内核还会挂载大量用作管理目的的虚拟文件系统 可用于手动在虚拟目录中挂载设备

umount 卸载设备 支持通过设备文件或者挂载点来指定要卸载的设备,若有程序正在使用设备上的文件,则系统将不允许卸载该设备

查看所有已挂载磁盘的使用情况 df

常用-h 显示磁盘空间

显示某个特定目录的磁盘使用情况 du

默认显示当前目录下所有文件、目录、子目录的磁盘使用情况,以磁盘块为单位来表明每个文件或目录占用了多大存储空间

-c 显示所有已列出文件的总大小 -h 以K M G为单位输出大小 -s 输出每个参数的汇总信息

4.3 处理数据文件

数据排序 sort

默认将文本文件中的数据进行字符排序

-n 将数字按值排序 -M 将字符按月排序 -r 逆序排序 -d 仅考虑空白字符和字母数字字符,不考虑特殊字符 -t 指定字段分隔符 -k 排序键从POS1位置开始,到POS2位置结束(如果指定POS2的话)

数据搜索 grep

grep [options] pattern [file]

数据压缩

工具 文件拓展名 描述
bzip2 .bz2  
compress .Z 使用少
gzip .gz 最流行
xz .xz 日渐流行
zip .zip  

gzip软件包包含:

gzip 用于压缩文件 可用通配符 gzcat 用于查看压缩过的文本文件的内容 gunzip 用于解压文件

数据归档 tar

tar function [options] object1 object2

function 定义了tar要进行的操作

操作 描述
-A 将一个tar归档文件追加到另一个tar归档文件末尾
-c 创建新的tar归档文件
-d 检查归档文件和文件系统的不同之处(–diff)从tar归档文件中删除文件(–delete)
-r 将文件追加到tar归档文件末尾
-t 列出tar归档文件的内容
-u 将比tar归档文件中已有的同名文件更新的文件追加到该归档文件
-x 从tar归档文件中提取文件

[options]

选项 描述
-C dir 切换到指定目录
-f file 将结果输出到文件或设备
-j 将输出传给bzip2命令进行压缩
-J 将输出传给xz命令进行压缩
-p 保留文件的所有权限
-v 在处理文件时显示文件名
-z 将输出传给gzip命令进行压缩
-Z 将输出传给compress命令进行压缩

.tgz结尾的文件是经gzip压缩过的tar文件 可用tar -zxvf filename.tgz 来提取其中的内容

第五章 理解shell

5.1 shell的类型

可使用which bash命令找出 bash shell 的位置 bash通常位于/usr/bin 目录,也可能位于/bin目录 在现代linux系统中,/bin目录通常是/usr/bin目录的符号链接

可能还存在tcsh zsh csh dsh等等shell 可查看文件 /etc/shells文件列出各种已安装的shell

默认的交互式shell也称登录shell,只要用户登录某个虚拟控制台终端或是在GUI中启动终端仿真器

作为默认的系统shell,sh用于那些需要在启动时使用的系统shell脚本

可以启动任意一种已安装的shell

echo $0会显示当前shell的名称(在shell命令行中),如果在shell脚本中使用,则显示的是脚本的名称

5.2 shell的父子关系

默认的交互式shell即登录shell是一个父shell

当用户在CLI提示符输入bash或其他shell程序名时,会创建新的shell程序,这是一个子shell

 

 

子shell既可以从父shell中创建,也可以从另一个子shell中创建

ps -f 可表现子shell间的嵌套关系,通过PPID列显示出谁是谁的父进程

可用exit退出子shell

exit命令不仅能够退出子shell,还可以注销当前的虚拟控制台终端或终端仿真器软件

查看进程列表

进程列表 圆括号包围起来一组命令 使命令列表变成进程列表 — 命令分组的一种,生成一个子shell来执行这些命令。可嵌套。

echo $BASH_SUBSHELL; 能用以判断是否生成了子shell

子shell用法 — 后台模式

后台模式介绍

sleep命令在后台(&)睡眠3000秒。当被置于后台时,在shell CLI 提示符返回之前,屏幕上会出现两条信息。第一条为方括号中的后台作业号,第二条为后台作业的进程ID

jobs 显示后台作业信息

-l 显示更多信息

后台作业完成,会显示出结束状态

将进程列表置入后台

可在子shell中进行大量的多进程处理

协程

同时在后台生成一个子shell 并将命令置于后台,在该子shell中执行命令

coproc

coproc My_job{ sleep 10; }命令中,'{}’ 前后与命令和’;’ 间必须要有一个空格 该命令在bash中使用

外部命令和内部命令

外部命令

存在于bash shell之外的程序,通常位于/bin /usr/bin /sbin /usr/sbin中

每当执行外部命令时,就会创建一个子进程。这种操作叫做衍生 forking。

例如:对于外部命令ps

ps命令的PPID为1879,即父进程shell的PID

 

因此只要涉及进程衍生,需耗费时间和资源来设置子进程的环境, 外部命令系统开销较高,内建命令开销较低

内建命令

无须使用子进程来执行

可使用 type which 命令判断某个命令是否为内建

有些命令有多种实现,例如echo 和 pwd 既有内建命令也有外部命令,可通过type -a查看

对于有多种实现的命令,如果想使用其外部命令实现,直接指明其对应的文件即可、如: 要使用外部命令pwd,可输入/usr/bin/pwd

history命令

查看最近用过的命令列表 — history

唤回历史记录中最近的命令 — !!

命令历史记录保存在 .zsh_history / .bash_history /…中

当shell退出时才被写入历史文件, 可用history -a命令强制将命令历史记录写入.zsh_history文件

可唤回历史记录的任意命令 !<编号>

使用命令别名 alias

查看当前可用的别名 alias -p (zsh内为alias)

创建自己的别名,注意别名只在其被定义的shell进程中才有效

可用unalias alias-name删除指定的别名

第六章 Linux环境变量

6.1 环境变量介绍

全局环境变量

对于shell会话和所有生成的子shell都是可见的

可用env 或 printenv命令来查看全局变量

可用printenv 或 echo 命令显示个别环境变量的值 (env不支持)

在变量前加$可以让变量作为其他命令的参数

局部环境变量

只在定义它的进程中可见

没有哪个命令可以只显示这类变量

用户可定义自己的局部变量,这些变量称为用户自定义局部变量

set命令可以显示特定进程的所有环境变量,包括局部变量,全局变量与用户自定义变量

6.2 设置用户自定义变量

设置局部用户自定义变量

可以使用等号为变量赋值,值可以是数值或字符串。 如果要引用该变量的值,在变量名前加$号即可 如果用于赋值的字符串包含空格,必须使用单引号或双引号来界定该字符串的起止

尽量用小写字母命名用户自定义的局部变量

注意:在变量名、等号和值直接没有空格,不然会被视作多个命令

只在设置该局部变量的shell可用

设置全局环境变量 export

也可直接使用export my_variable=”I am Global now” 定义全局变量

修改子shell中的全局环境变量不会影响父shell中该变量的值

6.3 删除环境变量 — unset

注意:如果在子进程中删除了一个全局环境变量,那么该操作仅对子进程有效,该全局变量在父进程中依然可用

6.4 默认的shell环境变量

 不是所有的默认环境变量都会在set命令的输出中列出,如果用不到,默认环境变量也并不要求有值

6.5 设置PATH环境变量

当使用外部命令时 ,shell必须搜索系统,从中找到对应的程序。

PATH环境变量定义了用于查找命令和程序的目录 如果命令或程序所在的位置没有包括在PATH变量中,那需要使用绝对路径,shell才能找到

可以把新的搜索目录添加到现有的PATH环境变量中,无需从头定义 ( 引用原来的PATH值,添加冒号: ,再使用绝对路径输入新目录)

6.6 定位系统环境变量

登录Linux系统启动bash shell时,默认情况下bash会在几个文件中查找命令。这些文件称作启动文件或环境文件。bash进程的启动文件取决于启动bash shell的方式。启动bash shell的方式有:

  1. 登录时作为默认登录shell

  2. 作为交互式shell,通过生成子shell启动

  3. 作为运行脚本的非交互式shell

登录shell

/etc/profile文件是bash shell的默认主启动文件,

/etc/bash.bashrc 包含系统环境变量

$HOME目录下的启动文件有:

$HOME/.bash_profile $HOME/.bashrc $HOME/.bash_login $HOME/.profile

这些文件都是为了提供用户专属的启动文件来定义该用户所用到的环境变量。 都以点号开头说明属于隐藏文件。 大多数Linux发行版只用4个启动文件中的一两个

$HOME代表某个用户的主目录,与 (~) 效果相同

交互式shell进程

作为交互式shell启动的bash并不处理/etc/profile文件,只检查用户$HOME中的.bashrc文件

非交互式shell

系统执行shell脚本时用的shell 没有命令行提示符

BASH_ENV 环境变量: 当shell启动一个非交互式shell进程时,会检查这个环境变量以查看要执行的启动文件名。如果有指定的文件,则shell会执行该文件里的命令,通常包括shell脚本变量设置

如果未设置BASH_ENV变量,shell脚本有可能是通过继承父shell的导出变量获取环境变量的,也有可能是使用了当前shell的局部变量和全局变量

环境变量持久化

对于全局环境变量(Linux系统的所有用户都要用到的变量)来说,不建议放在/etc/profile文件中,因为/etc/profile文件会随发行版的更新而更新。

最好在/etc/profile.d目录中创建一个以.sh结尾 的文件,把所有新的或修改过的全局环境变量设置放在这个文件中

在大多数发行版中,保存个人用户永久性bash shell变量的最佳地点是$HOME/.bashrc文件,这适用于所有类型的shell进程。但如果设置了BASH_ENV,除非值为$HOME/.bashrc,否则应该将非交互式的用户变量放在别的地方

可以把个人的alias设置放在$HOME/.bashrc启动文件中,使其效果永久化

6.7 数组变量

环境变量可以作为数组使用,但不常用

索引方式在不同shell间不同

可修改数组中的某个值

可删除数组中的某个值,也可删除整个数组