shell 环境

恰如我们之前所讲的,shell 在 shell 会话中保存着大量信息。这些信息被称为 (shell 的) 环境。 程序获取环境中的数据(即环境变量)来了解本机的配置。虽然大多数程序用配置文件来存储程序设置, 一些程序会根据环境变量来调整他们的行为。知道了这些,我们就可以用环境变量来自定制 shell 体验。

  • printenv - 打印部分或所有的环境变量
  • set - 设置 shell 选项
  • export— 导出环境变量,让随后执行的程序知道。
  • alias - 创建命令别名
  1. [root@iZ8vb3yphb2x30z813n1xpZ ~]# printenv
  2. XDG_SESSION_ID=17877
  3. HOSTNAME=iZ8vb3yphb2x30z813n1xpZ
  4. TERM=xterm
  5. SHELL=/bin/bash
  6. HISTSIZE=1000
  7. SSH_CLIENT=49.82.138.241 23566 22
  8. SSH_TTY=/dev/pts/1
  9. USER=root
  10. LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
  11. MAIL=/var/spool/mail/root
  12. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  13. PWD=/root
  14. LANG=en_US.UTF-8
  15. HISTCONTROL=ignoredups
  16. SHLVL=1
  17. HOME=/root
  18. LOGNAME=root
  19. SSH_CONNECTION=49.82.138.241 23566 172.26.252.79 22
  20. LESSOPEN=||/usr/bin/lesspipe.sh %s
  21. XDG_RUNTIME_DIR=/run/user/0
  22. _=/usr/bin/printenv
  23. [root@iZ8vb3yphb2x30z813n1xpZ ~]# echo $PATH
  24. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

我们对于文件 .bashrc 的修改不会生效,直到我们关闭终端会话,再重新启动一个新的会话, 因为 .bashrc 文件只是在刚开始启动终端会话时读取。然而,我们可以强迫 bash 重新读取修改过的 .bashrc 文件,使用下面的命令:

[me@linuxbox ~]$ source .bashrc

vi 简介

第一版 vi 是在1976由 Bill Joy 写成的,当时他是加州大学伯克利分校的学生, 后来他共同创建了 Sun 微系统公司。vi 这个名字 来源于单词“visual”,因为它打算在带有可移动光标的视频终端上编辑文本。
大多数 Linux 发行版不包含真正的 vi;而是自带一款高级替代版本,叫做 vim(它是“vi improved”的简写)由 Bram Moolenaar 开发的。vim 相对于传统的 Unix vi 来说,取得了实质性进步。通常,vim 在 Linux 系统中是“vi”的符号链接(或别名)。 在随后的讨论中,我们将会假定我们有一个叫做“vi”的程序,但它其实是 vim。

启动和退出 vi

要想启动 vi,只要简单地输入以下命令:

[me@linuxbox ~]$ vi

image.png
要退出 vi,输入下面的命令(注意冒号是命令的一部分):

:q

shell 提示符应该重新出现。如果由于某种原因,vi 不能退出(通常因为我们对文件做了修改,却没有保存文件)。 通过给命令加上叹号,我们可以告诉 vi 我们真要退出 vi。(注意感叹号是命令的一部分)

:q!

小贴示:如果你在 vi 中“迷失”了,试着按下 Esc 键两次来回到普通模式。

编辑模式

再次启动 vi,这次传递给 vi 一个不存在的文件名。这也是用 vi 创建新文件的方法。

[me@linuxbox ~]$ rm -f foo.txt
[me@linuxbox ~]$ vi foo.txt

如果一切正常,我们应该获得一个像这样的屏幕:

....
"foo.txt" [New File]

每行开头的波浪号(”~”)表示那一行没有文本。这里我们有一个空文件。先别进行输入!
关于 vi ,第二重要的事是知晓vi 是一个模式编辑器。(第一件事是如何退出 vi )vi 启动后会直接进入 命令模式。这种模式下,几乎每个按键都是一个命令,所以如果我们直接输入文本,vi 会发疯,弄得一团糟。

插入模式

为了在文件中添加文本,我们需要先进入插入模式。按下”i”键进入插入模式。之后,我们应当 在屏幕底部看到如下的信息,如果 vi 运行在高级模式下( vi 在兼容模式下不会显示这行信息):

-- INSERT --

现在我们能输入一些文本了。试着输入这些文本:

The quick brown fox jumped over the lazy dog.

若要退出插入模式返回命令模式,按下 Esc 按键。
Saving Our Work

保存我们的工作

为了保存我们刚才对文件所做的修改,我们必须在命令模式下输入一个 ex 命令。 通过按下”:”键,这很容易完成。按下冒号键之后,一个冒号字符应该出现在屏幕的底部:

:

为了写入我们修改的文件,我们在冒号之后输入”w”字符,然后按下回车键:

:w

文件将会写入到硬盘,而且我们会在屏幕底部看到一行确认信息,就像这样:

"foo.txt" [New] 1L, 46C written

image.png
小贴示:如果你阅读 vim 的文档,你会发现命令模式被(令人困惑地)叫做普通模式,ex 命令 叫做命令模式。当心。

移动光标

表13-1: 光标移动按键

按键 移动光标
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 移动到文件末尾。

基本编辑

追加文本

如果我们想要在这个句子的末尾添加一些文本,我们会发现 i 命令不能完成任务,因为我们不能把 光标移到行尾。vi 提供了追加文本的命令,明智地命名为”a”。如果我们把光标移动到行尾,输入”a”, 光标就会越过行尾,同时 vi 会进入插入模式。这让我们能添加文本到行末:

The quick brown fox jumped over the lazy dog. It was cool.

按下 ESC 键 输入:w 回车
image.png
因为我们几乎总是想要在行尾添加文本,所以 vi 提供了一个快捷键。光标将移动到行尾,同时 vi 进入输入模式。 它是”A”命令。试着用一下它,向文件添加更多行。
首先,使用”0”(零)命令,将光标移动到行首。现在我们输入”A”,然后输入下面这些文本:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

打开一行

表13-2: 文本行打开按键

命令 打开行
o 当前行的下方打开一行。
O 当前行的上方打开一行。

我们可以演示一下:把光标移到”Line 3”上,再按下小 o 按键。

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
line 4
line 5

在第三行之下打开了新的一行,并且进入插入模式。按下 Esc,退出插入模式。按下 u 按键,撤销我们的修改。
按下大 O 按键在光标之上打开新的一行:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

按下 Esc 按键,退出插入模式,并且按下 u 按键,撤销我们的更改。

删除文本

正如我们所愿,vi 提供了各种删除文本到的方法,而且只需一或两个按键。首先, x 按键会删除光标位置的一个字符。可以在 x 命令之前带上一个数字,来指明要删除的字符个数。 d 按键更通用一些。跟 x 命令一样,d 命令之前可以带上一个数字,来指定要执行的删除次数。另外, d 命令之后总是带上一个移动命令,用来控制删除的范围。这里有些实例:
表13-3: 文本删除命令

命令 删除的文本
x 当前字符
3x 当前字符及其后的两个字符。
dd 当前行。
5dd 当前行及随后的四行文本。
dW 从光标位置开始到下一个单词的开头。
d$ 从光标位置开始到当前行的行尾。
d0 从光标位置开始到当前行的行首。
d^ 从光标位置开始到文本行的第一个非空字符。
dG 从当前行到文件的末尾。
d20G 从当前行到文件的第20行。