Shell 环境
shell
在环境中存储了两种基本类型的数据,虽然 bash
几乎无法分辨这些数据的类型。它们是环境变量和 shell
变量。
检查环境变量
set
显示 shell
变量、shell
函数和环境变量,printenv
只显示环境变量。printenv [name]
还能输出变量的值(当然常用的还是 echo $[name]
)。而别名只能通过 alias
来查看。
建立 shell 环境
当我们登录系统后,bash
程序启动,并且会读取一系列称为启动文件的配置脚本,这些文件定义了默认的可供所有用户共享的 shell
环境。然后是读取更多位于我们自己家目录中的启动文件,这些启动文件定义了用户个人的 shell
环境。确切的启动顺序依赖于要运行的 shell
会话类型。有两种 shell
会话类型:一个是登录 shell
会话,另一个是非登录 shell
会话。
登录 shell
会话会在其中提示用户输入用户名和密码;例如,我们启动一个虚拟控制台会话。非登录 shell
会话通常当我们在 GUI
下启动终端会话时出现。
退出命令:
- 执行
exit
命令,退出一个shell
(登录或非登录shell
); - 执行
logout
命令,退出登录shell
(不能退出非登录shell
)。
登录 shell
会读取一个或多个启动文件,如下表:
文件 | 内容 |
---|---|
/etc/profile | 应用于所有用户的全局配置脚本。 |
~/.bash_profile | 用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置。 |
~/.bash_login | 如果文件 ~/.bash_profile 没有找到,bash 会尝试读取这个脚本。 |
~/.profile | 如果文件 ~/.bash_profile 或文件 ~/.bash_login 都没有找到,bash 会试图读取这个文件。 这是基于 Debian 发行版的默认设置,比方说 Ubuntu。 |
非登录 shell
会读取以下启动文件:
文件 | 内容 |
---|---|
/etc/bash.bashrc | 应用于所有用户的全局配置文件。 |
~/.bashrc | 用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置。 |
除了读取以上启动文件之外,非登录 shell
会话也会继承它们父进程的环境设置,通常是一个登录 shell
。
在普通用户看来,文件 ~/.bashrc
可能是最重要的启动文件,因为它几乎总是被读取(每次执行 shell
脚本时都会重新读取)。非登录 shell
默认会读取它,并且大多数登录 shell
的启动文件也会能读取 ~/.bashrc
文件。
一个启动文件的内容
看一下典型的 .bash_profile
文件:
1 | # .bash_profile |
修改
修改后使用 source ***
激活启动文件。
vi 简介
第一版 vi
是在 1976 由 Bill Joy 写成的,当时他是加州大学伯克利分校的学生,后来他共同创建了 Sun
微系统公司。vi
这个名字来源于单词“visual”,因为它打算在带有可移动光标的视频终端上编辑文本。在发明可视化编辑器之前,有一次只能操作一行文本的行编辑器。为了编辑,我们需要告诉行编辑器到一个特殊行并且说明做什么修改,比方说添加或删除文本。视频终端(而不是基于打印机的终端,像电传打印机)的出现,使可视化编辑成为可能。vi
实际上整合了一个强大的行编辑器 ———— ex , 所以我们在使用 vi
时能运行行编辑命令。
命令
按
i
进入插入模式。:w
保存。u
是undo
。p
粘贴到光标位置之后,P
粘贴到光标位置之前。查找:
f
命令能搜索一特定行,并将光标移动到下一个匹配的字符上。例如,命令fa
会把光标定位到同一行中下一个出现的”a”字符上。在进行了一次行内搜索后,输入分号能重复这次搜索。
移动光标到下一个出现的单词或短语上,使用/
命令。当你输入/
命令后,一个”/”字符会出现在屏幕底部。接下来,输入要查找的单词或短语, 按下回车。光标就会移动到下一个包含所查找字符串的位置。通过n
命令来重复先前的查找。替换
vi
使用ex
命令来执行查找和替代操作(vi
中叫做“替换”)。将整个文件中的单词“Line”更改为“line”, 输入以下命令(后面再加个c
则每次替换会提醒用户确认):1
:%s/Line/line/g
条目 | 含义 |
---|---|
: | 冒号字符运行一个 ex 命令。 |
% | 指定要操作的行数。% 是一个快捷方式,表示从第一行到最后一行。另外,操作范围也 可以用 1,5 来代替(因为我们的文件只有 5 行文本),或者用 1,$ 来代替,意思是 “ 从第一行到文件的最后一行。”如果省略了文本行的范围,那么操作只对当前行生效。 |
s | 指定操作。在这种情况下是,替换(查找与替代)。 |
/Line/line | 查找类型与替代文本。 |
g | 这是“全局”的意思,意味着对文本行中所有匹配的字符串执行查找和替换操作。如果省略 g,则 只替换每个文本行中第一个匹配的字符串。 |
- 编辑多个文件
vi file1 file2 file3...
打开多个文件。:n
切换到下一个文件。:N
切换到上一个文件。:buffers
列出文件缓冲,:buffers 缓冲区编号
切换到对应的文件。
移动光标:
按键 | 移动光标 |
---|---|
l or 右箭头 | 向右移动一个字符 |
h or 左箭头 | 向左移动一个字符 |
j or 下箭头 | 向下移动一行 |
k or 上箭头 | 向上移动一行 |
0 (零按键) | 移动到当前行的行首。 |
^ | 移动到当前行的第一个非空字符。 |
$ | 移动到当前行的末尾。 |
w | 移动到下一个单词或标点符号的开头。 |
W | 移动到下一个单词的开头,忽略标点符号。 |
b | 移动到上一个单词或标点符号的开头。 |
B | 移动到上一个单词的开头,忽略标点符号。 |
Ctrl-f or Page Down | 向下翻一页 |
Ctrl-b or Page Up | 向上翻一页 |
numberG | 移动到第 number 行。例如,1G 移动到文件的第一行。 |
G | 移动到文件末尾。 |
文本删除命令(这个 d
命令不仅删除文本,它还“剪切”文本。):
命令 | 删除的文本 |
---|---|
x | 当前字符 |
3x | 当前字符及其后的两个字符。 |
dd | 当前行。 |
5dd | 当前行及随后的四行文本。 |
dW | 从光标位置开始到下一个单词的开头。 |
d$ | 从光标位置开始到当前行的行尾。 |
d0 | 从光标位置开始到当前行的行首。 |
d^ | 从光标位置开始到文本行的第一个非空字符。 |
dG | 从当前行到文件的末尾。 |
d20G | 从当前行到文件的第 20 行。 |
复制命令:
命令 | 复制的内容 |
---|---|
yy | 当前行。 |
5yy | 当前行及随后的四行文本。 |
yW | 从当前光标位置到下一个单词的开头。 |
y$ | 从当前光标位置到当前行的末尾。 |
y0 | 从当前光标位置到行首。 |
y^ | 从当前光标位置到文本行的第一个非空字符。 |
yG | 从当前行到文件末尾。 |
y20G | 从当前行到文件的第 20 行。 |