LINUX 101: 让你的 SHELL 更强大
================================================================================
> 在我们的关于 shell 基础的指导下, 得到一个更灵活,功能更强大且多彩的命令行界面

**为何要这样做?**

- 使得在 shell 提示符下过得更轻松,高效
- 在失去连接后恢复先前的会话
- Stop pushing around that fiddly rodent! 

![bash1](http://www.linuxvoice.com/wp-content/uploads/2015/02/bash1-large15.png)

这是我的命令行提示符的设置。对于这个小的终端窗口来说，这或许有些长。但你可以根据你的喜好来调整它。

作为一个 Linux 用户, 你可能熟悉 shell (又名为命令行)。 或许你需要时不时的打开终端来完成那些不能在 GUI 下处理的必要任务，抑或是因为你处在一个将窗口铺满桌面的环境中，而 shell 是你与你的 linux 机器交互的主要方式。

在上面那些情况下，你可能正在使用你所使用的发行版本自带的 Bash 配置。 尽管对于大多数的任务而言，它足够好了，但它可以更加强大。 在本教程中，我们将向你展示如何使得你的 shell 提供更多有用信息、更加实用且更适合工作。 我们将对提示符进行自定义，让它比默认情况下提供更好的反馈，并向你展示如何使用炫酷的 `tmux` 工具来管理会话并同时运行多个程序。 并且，为了让眼睛舒服一点，我们还将关注配色方案。那么，进击吧，少女！

### 让提示符更美妙 ###

大多数的发行版本配置有一个非常简单的提示符，它们大多向你展示了一些基本信息， 但提示符可以为你提供更多的内容。例如，在 Debian 7 下，默认的提示符是这样的:

    mike@somebox:~$

上面的提示符展示出了用户、主机名、当前目录和账户类型符号（假如你切换到 root 账户， **$** 会变为 **#**)。 那这些信息是在哪里存储的呢? 答案是：在 **PS1** 环境变量中。 假如你键入 `echo $PS1`， 你将会在这个命令的输出字符串的最后有如下的字符：

    \u@\h:\w$

这看起来有一些丑陋，并在瞥见它的第一眼时，你可能会开始尖叫，认为它是令人恐惧的正则表达式，但我们不打算用这些复杂的字符来煎熬我们的大脑。这不是正则表达式，这里的斜杠是转义序列，它告诉提示符进行一些特别的处理。 例如，上面的 **u** 部分，告诉提示符展示用户名， 而 w 则展示工作路径.

下面是一些你可以在提示符中用到的字符的列表:

- d 当前的日期
- h 主机名
- n 代表换行的字符
- A 当前的时间 (HH:MM)
- u 当前的用户
- w (小写) 整个工作路径的全称
- W (大写) 工作路径的简短名称
- $ 一个提示符号，对于 root 用户为 # 号
- ! 当前命令在 shell 历史记录中的序号

下面解释 **w** 和 **W** 选项的区别: 对于前者，你将看到你所在的工作路径的完整地址，（例如 **/usr/local/bin**），而对于后者， 它则只显示 **bin** 这一部分。

现在，我们该怎样改变提示符呢? 你需要更改 **PS1** 环境变量的内容，试试下面这个：

    export PS1="I am \u and it is \A $"
    
现在，你的提示符将会像下面这样：

    I am mike and it is 11:26 $

从这个例子出发，你就可以按照你的想法来试验一下上面列出的其他转义序列。 但等等 – 当你登出后，你的这些努力都将消失，因为在你每次打开终端时，**PS1** 环境变量的值都会被重置。解决这个问题的最简单方式是打开 **.bashrc** 配置文件（在你的家目录下） 并在这个文件的最下方添加上完整的 `export` 命令。在每次你启动一个新的 shell 会话时，这个 **.bashrc** 会被 `Bash` 读取, 所以你的加强的提示符就可以一直出现。你还可以使用额外的颜色来装扮提示符。刚开始，这将有点棘手，因为你必须使用一些相当奇怪的转义序列，但结果是非常漂亮的。 将下面的字符添加到你的 **PS1**字符串中的某个位置，最终这将把文本变为红色：

    \[\e[31m\]

你可以将这里的 31 更改为其他的数字来获得不同的颜色:

- 30 黑色
- 32 绿色
- 33 黄色
- 34 蓝色
- 35 洋红色
- 36 青色
- 37 白色

所以，让我们使用先前看到的转义序列和颜色来创造一个提示符，以此来结束这一小节的内容。深吸一口气,弯曲你的手指，然后键入下面这只“野兽”：

    export PS1="(\!) \[\e[31m\] \[\A\] \[\e[32m\]\u@\h \[\e[34m\]\w \[\e[30m\]$"

上面的命令提供了一个 Bash 命令历史序号、当前的时间、彩色的用户或主机名组合、以及工作路径。假如你“野心勃勃”，利用一些惊人的组合，你还可以更改提示符的背景色和前景色。非常有用的 Arch wiki 有一个关于颜色代码的完整列表：[http://tinyurl.com/3gvz4ec][1]。

> **Shell 精要**
> 
> 假如你是一个彻底的 Linux 新手并第一次阅读这份杂志，或许你会发觉阅读这些教程有些吃力。 所以这里有一些基础知识来让你熟悉一些 shell。 通常在你的菜单中， shell 指的是 Terminal、 XTerm 或 Konsole， 当你启动它后， 最为实用的命令有这些：
> 
> **ls** (列出文件名); **cp one.txt two.txt** (复制文件); **rm file.txt** (移除文件); **mv old.txt new.txt** (移动或重命名文件);
> 
> **cd /some/directory** (改变目录); **cd ..** (回到上级目录); **./program** (在当前目录下运行一个程序); **ls > list.txt** (重定向输出到一个文件)。
> 
> 几乎每个命令都有一个手册页用来解释其选项（例如 **man ls** – 按 Q 来退出）。在那里，你可以知晓命令的选项，这样你就知道 **ls -la** 展示一个详细的列表，其中也列出了隐藏文件， 并且在键入一个文件或目录的名字的一部分后， 可以使用 Tab 键来自动补全。

### Tmux: 针对 shell 的窗口管理器 ###

在文本模式的环境中使用一个窗口管理器 – 这听起来有点不可思议， 是吧？ 然而，你应该记得当 Web 浏览器第一次实现分页浏览的时候吧？ 在当时， 这是在可用性上的一个重大进步，它减少了桌面任务栏的杂乱无章和繁多的窗口列表。 对于你的浏览器来说，你只需要一个按钮便可以在浏览器中切换到你打开的每个单独网站， 而不是针对每个网站都有一个任务栏或导航图标。 这个功能非常有意义。

若有时你同时运行着几个虚拟终端，你便会遇到相似的情况； 在这些终端之间跳转，或每次在任务栏或窗口列表中找到你所需要的那一个终端，都可能会让你觉得麻烦。 拥有一个文本模式的窗口管理器不仅可以让你像在同一个终端窗口中运行多个 shell 会话，而且你甚至还可以将这些窗口排列在一起。

另外，这样还有另一个好处：可以将这些窗口进行分离和重新连接。想要看看这是如何运行的最好方式是自己尝试一下。在一个终端窗口中，输入 `screen` （在大多数发行版本中，它已经默认安装了或者可以在软件包仓库中找到）。 某些欢迎的文字将会出现 – 只需敲击 Enter 键这些文字就会消失。 现在运行一个交互式的文本模式的程序，例如 `nano`， 并关闭这个终端窗口。

在一个正常的 shell 对话中， 关闭窗口将会终止所有在该终端中运行的进程 – 所以刚才的 Nano 编辑对话也就被终止了， 但对于 screen 来说，并不是这样的。打开一个新的终端并输入如下命令：

    screen -r

瞧，你刚开打开的 Nano 会话又回来了！

当刚才你运行 **screen** 时， 它会创建了一个新的独立的 shell 会话， 它不与某个特定的终端窗口绑定在一起，所以可以在后面被分离并重新连接（即 **-r** 选项）。

当你正使用 SSH 去连接另一台机器并做着某些工作时， 但并不想因为一个脆弱的连接而影响你的进度，这个方法尤其有用。假如你在一个 **screen** 会话中做着某些工作，并且你的连接突然中断了（或者你的笔记本没电了，又或者你的电脑报废了——不是这么悲催吧），你只需重新连接或给电脑充电或重新买一台电脑，接着运行 **screen -r** 来重新连接到远程的电脑，并在刚才掉线的地方接着开始。

现在，我们都一直在讨论 GNU 的 **screen**，但这个小节的标题提到的是 tmux。 实质上， **tmux** （terminal multiplexer） 就像是 **screen** 的一个进阶版本，带有许多有用的额外功能，所以现在我们开始关注 tmux。 某些发行版本默认包含了 **tmux**； 在其他的发行版本上，通常只需要一个 **apt-get、 yum install** 或 **pacman -S** 命令便可以安装它。

一旦你安装了它过后，键入 **tmux** 来启动它。接着你将注意到，在终端窗口的底部有一条绿色的信息栏，它非常像传统的窗口管理器中的任务栏： 上面显示着一个运行着的程序的列表、机器的主机名、当前时间和日期。 现在运行一个程序，同样以 Nano 为例， 敲击 Ctrl+B 后接着按 C 键， 这将在 tmux 会话中创建一个新的窗口，你便可以在终端的底部的任务栏中看到如下的信息:

    0:nano- 1:bash*

每一个窗口都有一个数字，当前呈现的程序被一个星号所标记。  Ctrl+B 是与 tmux 交互的标准方式， 所以若你敲击这个按键组合并带上一个窗口序号， 那么就会切换到对应的那个窗口。你也可以使用 Ctrl+B 再加上 N 或 P 来分别切换到下一个或上一个窗口 – 或者使用 Ctrl+B 加上 L 来在最近使用的两个窗口之间来进行切换（有点类似于桌面中的经典的 Alt+Tab 组合键的效果）。 若需要知道窗口列表，使用 Ctrl+B 再加上 W。

目前为止，一切都还好：现在你可以在一个单独的终端窗口中运行多个程序，避免混乱（尤其是当你经常与同一个远程主机保持多个 SSH 连接时）。 当想同时看两个程序又该怎么办呢？

针对这种情况， 可以使用 tmux 中的窗格。 敲击 Ctrl+B 再加上 % ， 则当前窗口将分为两个部分：一个在左一个在右。你可以使用 Ctrl+B 再加上 O 来在这两个部分之间切换。 这尤其在你想同时看两个东西时非常实用， – 例如一个窗格看指导手册，另一个窗格里用编辑器看一个配置文件。

有时，你想对一个单独的窗格进行缩放，而这需要一定的技巧。 首先你需要敲击 Ctrl+B 再加上一个 :（冒号），这将使得位于底部的 tmux 栏变为深橙色。 现在，你进入了命令模式，在这里你可以输入命令来操作 tmux。 输入 **resize-pane -R** 来使当前窗格向右移动一个字符的间距， 或使用 **-L** 来向左移动。 对于一个简单的操作，这些命令似乎有些长，但请注意，在 tmux 的命令模式（前面提到的一个分号开始的模式）下，可以使用 Tab 键来补全命令。 另外需要提及的是， **tmux** 同样也有一个命令历史记录，所以若你想重复刚才的缩放操作，可以先敲击 Ctrl+B 再跟上一个分号，并使用向上的箭头来取回刚才输入的命令。

最后，让我们看一下分离和重新连接 - 即我们刚才介绍的 screen 的特色功能。 在 tmux 中，敲击 Ctrl+B 再加上 D 来从当前的终端窗口中分离当前的 tmux 会话。这使得这个会话的一切工作都在后台中运行、使用 `tmux a` 可以再重新连接到刚才的会话。但若你同时有多个 tmux 会话在运行时，又该怎么办呢? 我们可以使用下面的命令来列出它们：

    tmux ls

这个命令将为每个会话分配一个序号； 假如你想重新连接到会话 1， 可以使用 `tmux a -t 1`. tmux 是可以高度定制的，你可以自定义按键绑定并更改配色方案， 所以一旦你适应了它的主要功能，请钻研指导手册以了解更多的内容。


![tmux](http://www.linuxvoice.com/wp-content/uploads/2015/02/tmux-large13.jpg)

上图中， tmux 开启了两个窗格： 左边是 Vim 正在编辑一个配置文件，而右边则展示着指导手册页。

> **Zsh: 另一个 shell**
> 
> 选择是好的，但标准同样重要。 你要知道几乎每个主流的 Linux 发行版本都默认使用 Bash shell – 尽管还存在其他的 shell。 Bash 为你提供了一个 shell 能够给你提供的几乎任何功能，包括命令历史记录，文件名补全和许多脚本编程的能力。它成熟、可靠并文档丰富 – 但它不是你唯一的选择。
> 
> 许多高级用户热衷于 Zsh， 即 Z shell。 这是 Bash 的一个替代品并提供了 Bash 的几乎所有功能，另外还提供了一些额外的功能。 例如， 在 Zsh 中，你输入 **ls** ，并敲击 Tab 键可以得到 **ls** 可用的各种不同选项的一个大致描述。 而不需要再打开 man page 了！
> 
> Zsh 还支持其他强大的自动补全功能： 例如，输入 **cd /u/lo/bi** 再敲击 Tab 键， 则完整的路径名 **/usr/local/bin** 就会出现（这里假设没有其他的路径包含 **u**, **lo** 和 **bi** 等字符）。 或者只输入 **cd** 再跟上 Tab 键，则你将看到着色后的路径名的列表 – 这比 Bash 给出的简单的结果好看得多。
> 
> Zsh 在大多数的主要发行版本上都可以得到了； 安装它后并输入 **zsh** 便可启动它。 要将你的默认 shell 从 Bash 改为 Zsh， 可以使用 **chsh** 命令。 若需了解更多的信息，请访问 [www.zsh.org][2]。

### “未来”的终端 ###

你或许会好奇为什么包含你的命令行提示符的应用被叫做终端。 这需要追溯到 Unix 的早期， 那时人们一般工作在一个多用户的机器上，这个巨大的电脑主机将占据一座建筑中的一个房间， 人们通过某些线路，使用屏幕和键盘来连接到这个主机， 这些终端机通常被称为“哑终端”， 因为它们不能靠自己做任何重要的执行任务 – 它们只展示通过线路从主机传来的信息，并输送回从键盘的敲击中得到的输入信息。

今天，我们在自己的机器上执行几乎所有的实际操作，所以我们的电脑不是传统意义下的终端，这就是为什么诸如 **XTerm**、 Gnome Terminal、 Konsole 等程序被称为“终端模拟器” 的原因 – 他们提供了同昔日的物理终端一样的功能。事实上，在许多方面它们并没有改变多少。诚然，现在我们有了反锯齿字体，更好的颜色和点击网址的能力，但总的来说，几十年来我们一直以同样的方式在工作。

所以某些程序员正尝试改变这个状况。 **Terminology** ([http://tinyurl.com/osopjv9][3])， 它来自于超级时髦的 Enlightenment 窗口管理器背后的团队，旨在让终端步入到 21 世纪，例如带有在线媒体显示功能。你可以在一个充满图片的目录里输入 **ls** 命令，便可以看到它们的缩略图，或甚至可以直接在你的终端里播放视频。 这使得一个终端有点类似于一个文件管理器，意味着你可以快速地检查媒体文件的内容而不必用另一个应用来打开它们。

接着还有 Xiki ([www.xiki.org][4])，它自身的描述为“命令的革新”。它就像是一个传统的 shell、一个 GUI 和一个 wiki 之间的过渡；你可以在任何地方输入命令，并在后面将它们的输出存储为笔记以作为参考，并可以创建非常强大的自定义命令。用几句话是很能描述它的，所以作者们已经创作了一个视频来展示它的潜力是多么的巨大(请看 **Xiki** 网站的截屏视频部分)。

并且 Xiki 绝不是那种在几个月之内就消亡的昙花一现的项目，作者们成功地进行了一次 Kickstarter 众筹，在七月底已募集到超过 $84,000。 是的,你没有看错 – $84K 来支持一个终端模拟器。这可能是最不寻常的集资活动了，因为某些疯狂的家伙已经决定开始创办它们自己的 Linux 杂志 ......

### 下一代终端 ###

许多命令行和基于文本的程序在功能上与它们的 GUI 程序是相同的，并且常常更加快速和高效。我们的推荐有：
**Irssi** (IRC 客户端); **Mutt** (mail 客户端); **rTorrent** (BitTorrent); **Ranger** (文件管理器); **htop** (进程监视器)。 若给定在终端的限制下来进行 Web 浏览， Elinks 确实做的很好，并且对于阅读那些以文字为主的网站例如 Wikipedia 来说。它非常实用。

> **微调配色方案**
> 
> 在《Linux Voice》杂志社中，我们并不迷恋那些养眼的东西，但当你每天花费几个小时盯着屏幕看东西时，我们确实认识到美学的重要性。我们中的许多人都喜欢调整我们的桌面和窗口管理器来达到完美的效果，调整阴影效果、摆弄不同的配色方案，直到我们 100% 的满意（然后出于习惯,摆弄更多的东西）。
> 
> 但我们倾向于忽视终端窗口，它理应也获得我们的喜爱，并且在 [http://ciembor.github.io/4bit][5] 你将看到一个极其棒的配色方案设计器，对于所有受欢迎的终端模拟器（**XTerm, Gnome Terminal, Konsole 和 Xfce4 Terminal 等都是支持的应用。**），它可以输出其设定。移动滑块直到你看到配色方案最佳， 然后点击位于该页面右上角的 `得到方案` 按钮。
> 
> 相似的，假如你在一个文本编辑器，如 Vim 或 Emacs 上花费了很多的时间，使用一个精心设计的调色板也是非常值得的。 **Solarized** [http://ethanschoonover.com/solarized][6] 是一个卓越的方案，它不仅漂亮，而且因追求最大的可用性而设计，在其背后有着大量的研究和测试。

--------------------------------------------------------------------------------

via: http://www.linuxvoice.com/linux-101-power-up-your-shell-8/

作者：[Ben Everard][a]
译者：[FSSlc](https://github.com/FSSlc)
校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出

[a]:http://www.linuxvoice.com/author/ben_everard/
[1]:http://tinyurl.com/3gvz4ec
[2]:http://www.zsh.org/
[3]:http://tinyurl.com/osopjv9
[4]:http://www.xiki.org/
[5]:http://ciembor.github.io/4bit
[6]:http://ethanschoonover.com/solarized