# 第二阶段：终端、Shell 与编辑器

## 终端与图形界面

UNIX/Linux 本身是没有图形界面的，我们通常在 UNIX/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件，

而 Linux 上的这套软件以前是 XFree86，现在则是 xorg（X.Org），而这套软件又是通过X 窗口系统（X Window System，也常被称为 X11 或 X）实现的，X 本身只是工具包及架构协议，而 xorg 便是 X 架构规范的一个实现体，也就是说它是实现了 X 协议规范的一个提供图形界面服务的服务器，就像实现了 http 协议提供 web 服务的 Apache 。如果只有服务器也是不能实现一个完整的桌面环境的，当然还需要一个客户端，我们称为 XClient，像如下 几个 大家 熟 知也 最流行 的 实 现 了 客户 端 功 能 的 桌 面 环 境 KDE，GNOME，XFCE，LXDE 。

![](d1c681e1fe1a10011942116f6d5ef4328214297d2c7d5aebf7c8f6e3cd4ce017.jpg)  
Linux/UNIX内核的XWindow图形架构

![](1a26caf02e0a3644f55cd108f01f997a7845e4fa7b6e30f255e3b6b7ee2999f6.jpg)

### 终端与控制台

我们并不是直接利用操作系统，而是利用shell的中间程序来完成。在图形界面下为了实现让我们在一个窗口中完成用户输入和显示输出。

Linux 系统还提供了一个叫做终端模拟器的程序（Terminal）。 下面是几个比较常见的终端模拟器：gnome-terminal，Konsole，xterm，rxvt，kvt，nxterm 和 eterm 。

不过要注意的是这里所说的终端（Terminal）和控制台（Console）是有区别的。

Tty 终端设备的统称 teletypewriters 电传打字机

现在叫终端（terminal）

终端是一种字符型设备

Tty1-tty6 表示文字界面，可以用 alt+ctrl+F1~F6 切换，F7 是返回图形界面

Pty 虚拟终端

远程 telnet 连接 到主 机或 使 用 xterm 时，需要 一 个 终 端 交 互 ， 这 就 是 虚 拟 终 端pty（pseudo-tty）

Pts/ptmx

终端本质上是对应着 Linux 上的 /dev/tty 设备，Linux 的多用户登录就是通过不同的 /dev/tty 设备完成的，Linux 默认提供了 6 个纯命令行界面的 “terminal”（准确的说这里应该是 6 个 virtualconsoles）来让用户登录。在物理机系统上你可以通过使用[Ctrl]+[Alt]+[F1]～[F6]进行切换。当你切换到其中一个终端后想要切换回图形界面，你可以按下[Ctrl] $^ +$ [Alt]+[F7]来完成。

Linux 接口

终端用户 GUI

TUI/CLI

程序员

System call

## 终端快捷键与 Tab 补全

两次Tab 可以显示全部候选结果  

<table><tr><td></td><td></td></tr><tr><td>按键</td><td>作用</td></tr><tr><td>Ctrl+d</td><td>键盘输入结束或退出终端</td></tr><tr><td>Ctrl+c</td><td>终止当前程序</td></tr><tr><td>按键</td><td>作用</td></tr><tr><td>Tab键</td><td>补全命令、目录、参数等</td></tr><tr><td>Ctrl+s</td><td>暂停当前程序,暂停后按下任意键恢复运行</td></tr><tr><td>Ctrl+z</td><td>将当前程序放到后台运行,恢复到前台为命令fg</td></tr><tr><td>Ctrl+a</td><td>将光标移至输入行头,相当于Home键</td></tr><tr><td>Ctrl+e</td><td>将光标移至输入行末,相当于End键</td></tr><tr><td>Ctrl+k</td><td>删除从光标所在位置到行末</td></tr><tr><td>Alt+Backspace</td><td>向前删除一个单词</td></tr><tr><td>Shift+PgUp</td><td>将终端显示向上滚动</td></tr><tr><td>Shift+PgDn</td><td>将终端显示向下滚动</td></tr><tr><td>Arrow up 向上键</td><td>恢复之前输入过的命令</td></tr><tr><td></td><td></td></tr></table>

## Shell 与命令行

这个 Shell（壳）。有壳就有核，这里的核就是指 UNIX/Linux 内核，Shell 是指“提供给使用者使用界面” 的软件（命令解析器），类似于 DOS （磁盘操作系统）下的 command（命令行）和后来的cmd.exe 。普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。同样的 UNIX/Linux 下的图形用户界面 GNOME 和 KDE，有时也被叫做 虚拟“ shell”或“ 图形 shell”。

UNIX/Linux 操作系统下的 Shell 既是用户交互的界面，也是控制系统的脚本语言。当然这一点也有别于 Windows 下的命令行，虽然该命令行也提供了很简单的控制语句。在 Windows 操作系统下，有些用户从来都不会直接使用 Shell，然而在 UNIX 系列操作系统下，Shell 仍然是控制系统启动、X11 启动和很多其它实用工具的脚本解释程序。

在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh、ksh、csh 等等，Ubuntu 终端默认使用的是 bash，默认的桌面环境是 GNOME 或者 Unity（基于 GNOME）。

在 linux 中，最最重要的就是命令，这就包含了 2 个过程，输入和输出

linux 的哲学就是：没有结果就是最好的结果

## 通配符

通配符是一种特殊语句，主要有星号（*）和问号（?），用来对字符串进行模糊匹配（比如文件名、参数名）

终端里面输入的通配符是由 Shell 处理的，不是由所涉及的命令语句处理的，它只会出现在命令的“ ” 参数值 里（它不能出现在命令名称里， 命令不记得，那就用 Tab补全）.总之，通配符实际上就是一种 Shell 实现的路径扩展功能。在通配符被处理后， Shell 会先完成该命令的重组，然后继续处理重组后的命令，直至执行该命令。

Shell 常用通配符：

<table><tr><td>字符</td><td>含义</td></tr><tr><td>*</td><td>匹配0或多个字符</td></tr><tr><td>?</td><td>匹配任意一个字符</td></tr><tr><td>[list]</td><td>匹配list中的任意单一字符</td></tr><tr><td>^[list]</td><td>匹配除list中的任意单一字符以外的字符</td></tr><tr><td>[c1-c2]</td><td>匹配c1-c2中的任意单一字符如：[0-9][a-z]</td></tr><tr><td>{string1, string2, .}</td><td>匹配string1或string2(或更多)其一字符串</td></tr><tr><td>{c1..c2}</td><td>匹配c1-c2中全部字符如{1..10}</td></tr></table>

## 帮助命令

在 Linux 环境中，如果你遇到困难，可以使用 $\mathfrak { m a n }$ 命令，它是 Manual pages 的缩写。

### man 命令

Man [options] command

为了便于查找，man 手册被进行了分册（分区段）处理，在 Research UNIX、BSD、OS X 和Linux 中，手册通常被分为 8 个区段，安排如下：

<table><tr><td>区段</td><td>说明</td></tr><tr><td>1</td><td>一般命令</td></tr><tr><td>2</td><td>系统调用</td></tr><tr><td>3</td><td>库函数，涵盖了C标准函数库</td></tr><tr><td>4</td><td>特殊文件（通常是/dev中的设备）和驱动程序</td></tr><tr><td>5</td><td>文件格式和约定</td></tr><tr><td>6</td><td>游戏和屏保</td></tr><tr><td>7</td><td>杂项</td></tr><tr><td>8</td><td>系统管理命令和守护进程</td></tr><tr><td>9</td><td>其他（Linux特定的），用来存放内核例行程序的文档。</td></tr></table>

要查看相应区段的内容，就在 man 后面加上相应区段的数字即可，如：

#### 示例：man 1 ls

所有的手册页遵循一个常见的布局，为了通过简单的 ASCII 文本展示而被优化，而这种情况下可能没有任何形式的高亮或字体控制。一般包括以下部分内容：

#### NAME（名称）

该命令或函数的名称，接着是一行简介。

#### SYNOPSIS（概要）

对于命令，正式的描述它如何运行，以及需要什么样的命令行参数。对于函数，介绍函数所需的参数，以及哪个头文件包含该函数的定义。

#### DESCRIPTION（说明）

命令或函数功能的文本描述。

#### OPTIONS

针对SYNOPSIS 部分中，有列举的所有可用的选项说明

#### COMMANDS

当这个程序在执行的时候，可以在此程序中下达的指令

#### FILES

这个程序或数据所使用或参考连接到的某些文件

#### EXAMPLES（示例）

常用的一些示例。

#### SEE ALSO（参见）

相关命令或函数的列表。

也可能存在其它部分内容，但这些部分没有得到跨手册页的标准化。常见的例子包括：OPTIONS（ 选 项 ） ，EXIT STATUS（退出状态 ） ，ENVIRONMENT（环境） ，BUGS（ 程 序漏洞），FILES（文件），AUTHOR（作者），REPORTING BUGS（已知漏洞），HISTORY（历史）和COPYRIGHT（版权）。

在 man 中使用搜索/<你要搜索的关键字>，查找完毕后你可以使用n键切换到下一个关键字所在处，shift $+ \Pi$ 为上一个关键字所在处。使用Space（空格键）翻页，Enter（回车键）向下滚动一行，或者使用k,j（vim 编辑器的移动键）进行向前向后滚动一行。按下h键为显示使用帮助（因为 man 使用 less 作为阅读器，实为 less 工具的帮助），按下 q 退出。

想要获得更详细的帮助，你还可以使用info命令，不过通常使用man就足够了。如果你知道某个命令的作用，只是想快速查看一些它的某个具体参数的作用，那么你可以使用--help参数，大部分命令都会带有这个参数，如：

### 示例：ls --help

## 查看版本内核号

第一个种方法使用 uname 命令。

常用的选项是-a，也可以使用-r。使用-a显示信息很长，包含不仅仅内核版本，所以也可以使用-r就是只是显示内核版本号。可以再配以-s和-m选项，显示稍微完整一些的信息，包括操作系统和硬件系统信息。

第二种方法是查看/proc下的version文件，该文件中包含内核版本信息。因为只是一个文件，所以使用任何可以查看文件内容的方法都可以，例如使用cat命令。

## 命令基本格式

cmd [options] [arguments]

说明：

最简单的Shell命令只有命令名，复杂的Shell命令可以有多个选项和参数。

选项和参数都作为Shell命令执行时的输入，它们之间用空格分隔开。

Linux区分大小写

单字符参数前使用一个减号（-）

单词参数前使用两个减号（--）。

多个单字符参数前可以只使用一个减号。

操作对象（arguments）可以是文件也可以是目录，有些命令必须使用多个操作对象， 如

cp 命令必须指定源操作对象和目标操作对象。

并非所有命令的格式都遵从以上规则，例如 dd、find 等

命令在正常执行结果后返回一个 0 值，如果命令出错，则返回一个非零值 (在 shell 中可用变量 $\$ 7$ 查看)。

## 内建命令与外部命令

内建命令实际上是 shell 程序的一部分，其中包含的是一些比较简单的 Linux 系统命令，这些命令是写在 bash 源码的 builtins 里面的，由 shell 程序识别并在 shell程序内部完成运行，通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程，因此其执行速度比外部命令快。比如：history、cd、exit 等等。

外部命令是 Linux 系统中的实用程序部分，因为实用程序的功能通常都比较强大，所以其包含的程序量也会很大，在系统加载时并不随系统一起被加载到内存中，而是在需要时才将其调入内存。虽然其不包含在 shell 中，但是其命令执行过程是由shell 程序控制的。外部命令是在 Bash 之外额外安装的，通常放在/bin，/usr/bin，/sbin，/usr/sbin 等等。比如：ls、vi 等。

我们可以使用 type 命令来区分命令是内建的还是外部的。

Info

与man功能相似的帮助，分页显示

Info [optinons] command

help 命令是用于显示 shell 内建命令的简要帮助信息。帮助信息中显示有该命令的简要说明以及一些参数的使用以及说明，一定记住 help 命令只能用于显示内建命令的帮助信息，不然就会得到你刚刚得到的结果。其实外部命令基本上都有一个参数command —help。

### whatis

查找一个存储所有相关命令信息的数据库，根据命令名返回相关结果

```txt
- Usage: whatis [options] command
- options: 选项（常用-d|-v|-r|-w|-l）
- command: 命令名 
```

## Vim

vi 是 “Visual interface” 的简称，它可以执行输出、删除、查找、替换、块操作等众多文本操作，而且用户可以根据自己的需要对其进行定制，这是其他编辑程序所没有的。

vi 不是一个排版程序，它不像 $\mathsf { M } \$ 1$ Word 或 WPS 那样可以对字体、格式、段落等其他属性进行编排，它只是一个文本编辑程序。

vi 是全屏幕文本编辑器，它没有菜单，只有命令。

vim 即 Vi IMproved，vi 克隆版本之一。

<table><tr><td>命令</td><td>说明</td></tr><tr><td>vi</td><td>直接进入</td></tr><tr><td>vi filename</td><td>打开或新建文件filename，并将光标置于第一行首</td></tr><tr><td>vi+n filename</td><td>打开文件filename，并将光标置于第n行首</td></tr><tr><td>vi+filename</td><td>打开文件filename，并将光标置于最后一行首</td></tr><tr><td>vi+/pattern filename</td><td>打开文件filename，并将光标置于第一个与pattern匹配的行</td></tr><tr><td>vi-r filename</td><td>打开上次用vi编辑时发生系统崩溃，恢复filename</td></tr></table>

Vi的3种运行模式

![](0d0f73426ce14a69adac39f65f4553e97e8ff61ab1b76e0c3bb9bb73acc5e42a.jpg)

■普通(normal)模式  
■插入(insert)模式  
■命令行(Cmdline)模式

![](41e15b2ba440e2148fd57dedf6c6c920988001002ff64c0aec7ddb110d1f808f.jpg)

### Normal 模式

在 shell 中输入 vim 启动编辑器时，即进入该模式。

无论什么时候，不管用户处于何种模式，只要按一下 Esc 键，即可使 vim 进入 Normal 模式。

在该模式下，用户可以输入各种合法的 vim 命令，用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释。

若输入的字符是合法的 vim 命令，则vim 在接受用户命令之后完成相应的动作。但需注意的是，所输入的命令并不在屏幕上显示出来。若输入的字符不是 vim 的合法命令，vim 会响铃报警。

#### Normal 模式常用命令

$\mathsf { x }$ 删除光标所在的字符

r 替换光标所在的字符

~ 切换光标所在字母的大小写

/和？用于查找字符串

dd、YY、p 分别用于剪切、复制和粘贴一行文本

u 取消上一次编辑操作（undo）

. 重复上一次编辑操作（redo）

ZZ 用于存盘退出Vi

ZQ用于不存盘退出Vi

### Insert 模式

在 Normal 模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r 或替换命令 s 等都可以进入 Insert 模式。

在该模式下，用户输入的任何字符都被vim当做文件内容保存起来，并将其显示在屏幕上。在文本输入过程中，若想回到Normal模式下，按Esc 键即可。

### Command 模式

Normal 模式下，用户按冒号“:” 即可进入 Command 模式，此时vim 会在显示窗口的最后一行 (屏幕的最后一行) 显示一个 “:” 作为 Command 模式的提示符，等待输入命令。

多数文件管理都是在此模式下执行的 (如保存文件等)

Command 模式中所有的命令都必须按 <回车>后执行，命令执行完后，vim 自动回到Normal 模式。

若在 Command 模式下输入命令过程中改变了主意，可按Esc键，或用退格键将输入的命令全部删除之后，再按一下退格键，即可使 vi 回到 Normal 模式下。

:n1,n2 co n3 用于块复制

:n1,n2 m n3 用于块移动

:n1,n2 d 用于块删除

:w 保存当前编辑文件，但并不退出

:w newfile 存为另外一个名为 “newfile” 的文件

:wq 用于存盘退出 Vi

:q! 用于不存盘退出 Vi

:q 用于直接退出Vi （未做修改）

设置vi环境

配置文件 ~/.vimrc

:set 显示设置的所有选项

:set all 显示所有可以设置的选项

:set autoindent 缩进,常用于程序的编写

:set noautoindent 取消缩进

显示隐藏行号 :set number/nonumber 简化:set nu/nonu

设置 $> >$ 和 $< <$ 缩进数量 :set shiftwidth $^ { = 4 }$

状态栏标尺 :set ruler/noruler

自动保存 :set autowrite/noautowrite

指示当前行 :set cursorline/nocursorline

语法高亮 :set syntax $\mathtt { . } { } = \mathtt { o n }$ 或 :syntax on/off

Tab 宽度 :set tabstop $^ { - 4 }$

配色方案

:colorscheme #显示当前配色方案名称

:colorscheme 方案名称 #设置配置方案

例： :colorscheme murphy

配色方案位置：/usr/share/vim/vim74/colors

vim插件

插件目录 ~/.vim/bundle

Vundle 插件管理器——vim bundle

在 github 上下载到 ~/.vim/bundle 目录中

git clone https://github.com/VundleVim/Vundle.vim.git

修改.vimrc 文件

:PluginInstall
