2.5 用户名、主机名及变量名补全

除了常见的文件名、命令名补全外,Shell 自动补全还支持其它补全类型。这充分展现了 Shell 自动补全多才多艺的一面。下面我们就来看一看 Shell 如何自动补全用户名。

当我输入

xiaodong@codeland:~$ ls ~

之后按 Tab,此时 bash 为我呈现了系统中存在的用户名列表。如图 2.7 所示。

bash 中的用户名自动补全备选列表

图 2.7: bash 中的用户名自动补全备选列表

我继续输入 x 并再次按 Tab,于是 bash 补全了 xiaodong 这个用户名。

xiaodong@codeland:~$ ls ~x<Tab>
xiaodong@codeland:~$ ls ~xiaodong/

在 zsh 中,我们可以看到,与 bash 相比,提供的补全用户名列表表现形式略有差异。bash 中包含 ~ 前缀,并在结尾带有 / (斜杠)。zsh 中则仅有用户名本身。如图 2.8 所示。

zsh 中的用户名自动补全备选列表

图 2.8: zsh 中的用户名自动补全备选列表

如果你经常使用 ssh 登录远程机器的话,那么主机名自动补全将助你一臂之力。同样,我们先来看一个例子。我在输入

xiaodong@codeland:~$ ssh xiaodong@l

后按 Tab,这时 bash 展示了可以自动补全的主机名列表。

xiaodong@codeland:~$ ssh xiaodong@l
xiaodong@lab.github.com         xiaodong@localhost
xiaodong@linuxtoy.org           xiaodong@localhost.localdomain
xiaodong@codeland:~$ ssh xiaodong@l

我接着输入 i 并按 Tab,这次 bash 就自动补全了完整的主机名 linuxtoy.org。你也可以直接在 @ 后按 Tab,这样的话就会显示全部主机名了。

xiaodong@codeland:~$ ssh xiaodong@li<Tab>
xiaodong@codeland:~$ ssh xiaodong@linuxtoy.org

不仅是主机名,而且 IP 地址也同样支持自动补全。另一种情况是,直接在输入 ssh l 后按 Tab,bash 也能对主机名进行自动补全。

xiaodong@codeland:~$ ssh l
lab.github.com         linuxtoy.org           localhost

看到这里,你或许会想,bash 从哪里找到这些可以用来自动补全的主机名呢?一个是 /etc/hosts 文件的内容,另一个是 ssh 的配置文件,比如 ~/.ssh/config。如图 2.9 所示。所以,如果你打算让 bash 为你自动补全常用的主机名的话,那么不妨考虑将其添加到这两个文件中。此外,还包括 ~/.ssh/known_hosts 文件。凡是通过 ssh 登录过的主机,便会包含其中。

自动补全的主机名来源

图 2.9: 自动补全的主机名来源

zsh 对主机名的自动补全与 bash 类似,此不赘述。

最后,让我们来看看对变量名的自动补全情况。当我输入

xiaodong@codeland:~$ echo $

后按 Tab 并根据提示按 y,这时 bash 显示了全部可供补全的变量名。如图 2.10 所示。

bash 中的变量名自动补全备选列表

图 2.10: bash 中的变量名自动补全备选列表

然后,我继续输入并搭配 Tab 按键,从而补全了变量 BASH_VERSION

xiaodong@codeland:~$ echo $BASH_VERSION

zsh 对变量的自动补全与 bash 相似,不过,在我的系统上比 bash 提供的补全列表更多一些。如图 2.11 所示。

zsh 中的变量名自动补全备选列表

图 2.11: zsh 中的变量名自动补全备选列表

综合来看,这几种补全类型跟前面我们所讲的文件名、命令名自动补全还是有一点差异,那就是它们带着一个特殊的前缀字符,参考表 2.1

表 2.1: 用户名、主机名及变量名自动补全前缀字符
前缀字符 自动补全类型
~ 用户名
@ 主机名
$ 变量名