这部分没有思维导图,一来是一开始读的时候就顺手写成了印象的markdown笔记,二是这部分书条理性比第一部分更清晰点(?)而且我是字太多更喜欢看图的人,这部分字比较少也是我不画图的一个原因,看字就行了【。】
以下是没什么用的阅读推荐BGM
【纯音乐】魔琴傀儡——薛振华
第二部分 配置与环境
第11章 环境
在shell会话调用环境期间,shell会存储大量信息。程序使用存储在环境中的数据来确定配置。大多数系统程序使用配置文件来存储程序设置,但也有一些会查找环境中存储的变量来调整自己的行为。
shell在环境中有两种基本类型的数据,分别是环境变量和shell变量,但在bash中,这两种类型基本上没有区别。shell变量是由bash存放的少量数据,环境变量就是除此之外的其他变量。
检查环境
了解环境中存储的内容,可以使用set命令或printenv命令。两者不同之处在于,set命令会同时显示shell变量和环境变量并以字母顺序排列,而printenv只会显示后者环境变量。
查询其中某一变量时,可以使用printenv 变量名的方式。
环境是如何建立的
用户登录后,bash程序就会启动并读取一系列称为启动文件的配置脚本,这些脚本定义了所有用户共享的默认环境。接下来,bash会读取更多存储在主目录下的用于顶一个人环境的启动文件。这些步骤执行的确切顺序是由启动的shell会话类型决定的,即login和non-login shell。
non-login shell会话会提示用户输入用户名和密码,如虚拟控制台会话。他会读取一个或多个启动文件,并且继承父类进程的环境,父类进程通常是一个login shell
【一个启动文件里会有的东西】
以 .bash_profile 文件为例,其中代码如下:
#.bash_profile
#Get the aliases and functions
if[-f~/.bashrc];then
.~/.bashrc
fi
# User sprcfic environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
这段代码中,#号开头的是注释,第一段逻辑是if复合命令,在第四部分详解,代码内容可以理解为
If the file "~/.bashrc" exists,then
read the "~/.bashrc" file.
第二段代码的重点是PATH变量,这一句的意思是在原先HOME变量的基础上扩展到bin文件夹。最后一段代码使告诉shell,将shell的子进程使用PATH变量的内容
PATH=$PATH:$HOME/bin
export PATH
修改环境
一般来说,在PATH中添加目录,或者定义额外的环境变量,需要讲这些更改放入到 .bash_profile文件中(或是其他的等效文件,取决于系统的发行版本)其他的改变则应该录入到 .bashrc 文件中。除非是系统管理员需要修改用户公用的默认设置。用户也可以修改其他目录下的文件。
一般为了修改这些文件,需要用到文本编辑器,本章中附带介绍的是nano编辑器,步骤如下:
- 使用cp命令备份需要修改的文件。如:cp .bashrc .bashrc.bak
- 启动nano文本编辑器。如:nano .bashrc
- nano退出使用ctrl x保存是ctrl o,修改后保存就再退出就完成对文件的修改了。
- 对 .bashrc 文件的读取只有在启动shell时才会做,所以修改也只有重启时才会生效,也可以使用source命令强制bash重新读取文件。如:source .bashrc
- 记住修改时要加上注释
第12章 VI简介
上一章修改文件时,由于我的服务器没有安装nano,所以实际上也用VI进行的修改。
VI是Unix的传统核心软件之一,它也是一个文本编辑器,总是可用,是个轻量级的软件,运行速度快。大多数Linux发行版配备的是加强版的vi——vim。
vi的使用步骤如下:
- vi命令打开编辑器,如果后面加上已存在的文件名,则会直接打开该文件,如果文件不存在,则会创建。如:vi foo.txt
- :q命令退出,注意不要少了冒号,vi的命令大多有冒号。如果有时候退出不了,可以多加一个感叹号来强制退出,即::q!
- :w命令保存
- i 进入插入编辑文本模式,编辑模式下最下方会有一句INSERT提示,如果没有该提示,说明处在命令行操作模式而不是文本编辑模式
- esc键退出文本编辑模式
- 命令行模式下 0 命令回到所在行开头
删除
关于删除d的命令列表如下
命令 | 删除内容 |
---|---|
x | 当前字符 |
3x | 当前字符和之后2个字符 |
dd | 当前行 |
5dd | 当前行和之后四行 |
dW | 当前字符到下一字符的起始 |
d$ | 当前字符到当前行末 |
d0 | 当前字符到当前行的起始 |
d^ | 当前字符到当前行下一个非空字符 |
dG | 当前行到文件末尾 |
d20G | 当前行到文件第20行 |
撤销和粘贴
u :取消操作
p :把d命令剪切删除掉的文本粘贴出来
复制
关于复制y的命令列表如下
命令 | 复制内容 |
---|---|
yy | 当前行 |
5yy | 当前行和之后四行 |
yW | 当前字符到下一单词的起始 |
y$ | 当前字符到当前行末 |
y0 | 当前字符到当前行的起始 |
y^ | 当前字符到当前行下一个非空字符 |
yG | 当前行到文件末尾 |
y20G | 当前行到文件第20行末尾 |
合并
J:合并行,注意是大写的
查找和替换
/word:查找斜杠后的字符,按enter开始查找,按n重复查找下一个
全局搜索和替换
以下面这个命令为例,将文件中的Line替换成line
:%s/Line/line/g[c]
命令功能解析
组成 | 含义 |
---|---|
: | 分号用于启动一条ex命令 |
% | 确定了操作作用的范围。%代表了从文件第1行到最后1行 |
s | 制定了具体的操作,本次是替换操作(搜索和替换) |
/Line/line | 搜索和替换的文本 |
g | 代指global(全局),也就是说对搜索到的每一行的每一个实例进行替换。如果g缺失,那么只替换每一行第一个符合条件的实例 |
c | 命令在每次替换前请求用户确认 |
询问时的句子如下:
replace with Line(y/n/a/q/l/E/Y)?
功能键释义如下
功能键 | 行为 |
---|---|
y | 执行替换 |
n | 跳过此次替换 |
a | 执行此次替换和之后的所有替换 |
q或ESC | 停止替换 |
l | 执行此次替换并退出替换,是last的缩写 |
Ctrl E,Ctrl Y | 分别是向下滚动和向上滚动,能用于查看替换出的上下文 |
编辑多个文件
vi file1 file2:编辑多个文件
:n:切换到下一个文件
:N:切回上一个文件
! :补充在切换命令后,则对文件的修改不会保存及切换
:r file2 :在打开了文件1后插入文件2的内容
:wq:保存并退出
:w newFile1:另存为新文件1
上述复制和剪切的命令仍然适用于多文件编辑
【书中的:buffer命令在阿里云Linux服务器上好像不起作用】
第13章 定制提示符
提示符的组成
提示符是由PS1变量定义的,echo命令可以帮助用户看到PS1的值,如:echo $PS1
显示如下:
[\u@\h \W]$
变量名可以自行修改,按照下表的转义字符列表可以自行尝试,相关的shell提示符中的转义字符列表如下:
转义字符 | 含义 |
---|---|
\a | ASCII铃声。在遇到该转移字符时,计算机发出哔哔声 |
\d | 当前日期,以星期、月、日的形式鸟事,如“Mon May 26” |
\h | 本地机器的主机名 |
\H | 完整的主机名 |
\j | 当前shell会话中进行的任务个数 |
\l | 当前终端设备的名称 |
\n | 换行符 |
\r | 回车符 |
\s | shell程序的名称 |
\t | 当前时间(24小时制),格式为小时:分钟:秒 |
\T | 当前时间(12小时制) |
@ | 当前(12小时制),格式为AM/PM |
\A | 当前(24小时制),格式为小时:分钟 |
\u | 当前用户的用户名 |
\v | shell的版本号 |
\V | shell的版本号和发行号 |
\w | 当前工作目录名 |
\W | 当前工作目录名承德最后一部分 |
! | 当前命令的历史编号 |
# | 当前shell会话中输入的命令数 |
$ | 在非管理员权限下输出“$”。管理员权限下输出“#” |
[ | 标志一个或多个非打印字符序列的开始。用于嵌入非打印的控制字符,使其以一定方式操纵终端仿真器,比如移动光标或更改文本颜色 |
] | 标志着非显示字符序列的结束 |
添加颜色
分为文本颜色、背景颜色、光标移动的颜色
字符序列 | 文本颜色 |
---|---|
\033[0;30m | 黑色 |
\033[0;31m | 红色 |
\033[0;32m | 绿色 |
\033[0;33m | 棕色 |
\033[0;34m | 蓝色 |
\033[0;35m | 紫色 |
\033[0;36m | 青色 |
\033[0;37m | 淡灰色 |
\033[1;30m | 深灰色 |
\033[1;31m | 淡红色 |
\033[1;32m | 淡绿色 |
\033[1;33m | 黄色 |
\033[1;34m | 淡蓝色 |
\033[1;35m | 淡紫色 |
\033[1;36m | 淡青色 |
\033[1;37m | 白色 |
字符序列 | 背景颜色 |
---|---|
\033[0;40m | 黑色 |
\033[0;41m | 红色 |
\033[0;42m | 绿色 |
\033[0;43m | 棕色 |
\033[0;44m | 蓝色 |
\033[0;45m | 紫色 |
\033[0;46m | 青色 |
\033[0;47m | 淡灰色 |
字符序列 | 光标移动动作 |
---|---|
\033[1;cH | 将光标移动至1行c列 |
\033[nA | 将光标向上移动n行 |
\033[nB | 将光标向下移动n行 |
\033[nC | 将光标向前移动n个字符 |
\033[nD | 将光标向后移动n个字符 |
\033[2J | 清空屏幕并将光标移动至左上角(第0行0列) |
\033[K | 清空当前光标位置到行末的内容 |
\033[s | 存储当前光标位置 |
\033[u | 恢复之前存储的光标位置 |
一个组合示例字符如下:
PS1="[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u]<\u@\h \W>$"
如果想要保存这个提示符,则只需保存到 .bashrc 文件中即可,代码如下:
PS1="\[\033[s\033[0;OH\033[0;41m\033[K\033[1;33m\t\033[Om\033[u\]<\u@\h \W>\$"
export PS1
具体动作解析如下表:
字符序列 | 动作 |
---|---|
[ | 开始一个非打印字符序列。其真正的目的是为了让bash正确计算可建提示符的长度。如果没有该字符,命令行编辑功能无法正确定位光标 |
\033[s | 存储光标位置。在屏幕的顶部横条绘制完成并显示时间后,读取并使光标返回此位置。需要注意的是,一些终端仿真器不支持该代码 |
\033[0;0H | 将光标移动至左上角,即第0行第0列 |
\033[0;41m | 将背景颜色设置为红色 |
\033[K | 将光标当前位置(左上角)到行末的内容清空。因为现在背景颜色已经是红色的了,所以清空后的行就是红色,也就绘制出了红色的横条。需要注意的是青空行的内容弄并不会改变光标的位置,光标仍处于左上角 |
\033[1;33m | 将文本颜色设置为黄色 |
\t | 显示当前时间。尽管这是一个可打印的原始,但还是将其包含在提示符非打印部分中,这是因为bash在计算可见提示符的长度时,不应当将其计算在内 |
\033[0m | 关闭颜色。对文本和背景有效 |
\033[u | 恢复之前存储的光标位置 |
] | 结束非打印的字符序列 |
<\u@\h \W>$ | 提示符字符串 |