命令行界面

命令行界面(Command-line interface),经常缩写为 CLI,亦即用户输入命令的地方。一旦用户将命令输入完毕并加以提交后,后续对命令的解析以及执行的任务都由 Shell 来完成。

与 CLI 相对的是 GUI,即 Graphical user interface,意为图形用户界面,它采用图形化的方式让用户与计算机进行交互。因其具有容易使用的优点,包括 Linux、macOS、Windows 等在内的现代操作系统无一例外都提供了图形用户界面。

既然图形用户界面要比命令行界面更加易用,那么是否说明可以完全抛弃命令行界面呢?答案是并非如此。事实上,有经验的用户尤其擅长使用命令行界面,其理由至少包括以下几个方面。

功能强大

让我们先来看一个例子:

xiaodong@codeland:~$ history |
    awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' |
    grep -v "./" |
    column -c3 -s " " -t |
    sort -nr |
    nl |
    head -n10

在作者的 macOS 系统上执行这条命令后,其输出结果如下:

 1  1348  14.3771%    cd
 2  1034  11.0282%    l
 3  838   8.93771%    git
 4  569   6.06869%    ssh
 5  513   5.47142%    cat
 6  405   4.31954%    vim
 7  372   3.96758%    brew
 8  360   3.83959%    scp
 9  265   2.82637%    rm
10  264   2.8157%     grep

这条命令虽然看起来似乎有些“吓人”,因为它由 history、awk、grep、column、sort、nl、head 等 7 个命令组成,并通过管道符(|)串接在一起;然而其结果却颇为有趣。它将作者平时在命令行中执行的所有命令都进行了统计,最终展示出 10 个最常用的命令,并相应列出每个命令的使用次数和所占百分比。

管道符将前一命令的输出作为后一命令的输入,使这些表面上不相干的命令进行协同工作,犹如搭积木一般。这是命令行的真正威力所在。

灵活高效

再看另一个例子,假如我们打算从 photos 目录中找出今年三月份拍摄的照片,并将其文件名称保存到 mar_photos.txt 这个文本文件中。在图形用户界面中,首先,我们可能会打开一个文件管理器(在 Linux 下也许是 GNOME Files,macOS 中则是 Finder)。接着,导航到 photos 这个目录,同时切换成详细视图模式。然后,我们睁大双眼逐一找出符合要求的照片。可是,现在怎么把照片的文件名称写到文本文件中呢?我们当然可以直接输入,或者想省点力使用复制和粘贴也行。要是找出的文件数量比较多,那可绝对是体力活。

但是,如果在命令行下,那么我们只需通过执行一条命令即可达到目的:

xiaodong@codeland:~$ cd photos; \
    ls -l | grep 'Mar' | awk '{ print $9 }' > mar_photos.txt

能自动化

使用命令行还有一个很棒的优势,那就是能够自动化各种操作。Shell 允许我们将所用的命令编写成函数(Function)或脚本(Script)。这样,我们不仅可以反复执行它们,而且函数或脚本比手动输入效率更高。由此,我们得以从重复的劳动中解放出来,从而能够腾出时间去做其它有意义的事情。

xiaodong@codeland:~$ ./script.sh

如何进入命令行

通过前面的描述,现在你应当了解:我们想要输入命令的界面是由 Shell 提供的。那么,如何执行 Shell 呢?我们可以通过下面两种方法来进入命令行。

通过控制台进入命令行

为了节省系统资源,Linux 服务器通常没有附带图形用户界面。当它启动完毕时,在控制台按照提示输入用户帐号及密码并登录后,所进入的即是命令行界面。以下为 Linux 服务器的登录提示:

login:
Password:

作为普通用户来说,一般使用的是具有图形用户界面的 Linux 桌面系统。在它启动后就直接进入了桌面,那么此时想要进入控制台,可以按照下列步骤执行:

  1. 按 Ctrl + Alt + F1 组合键,进入编号为 1 的控制台。

  2. 按 Ctrl + Alt + F2 组合键,进入编号为 2 的控制台。

  3. 依次类推,可以分别进入 3 号、4 号、5 号、以及 6 号控制台。在默认情况下,Linux 一般提供 6 个控制台。

  4. 如果要从控制台返回到桌面,则可以按 Ctrl + Alt + F7 组合键。

要是在控制台的丛林中迷失了方向,我们可以执行 tty 命令来了解当前在哪个控制台。

通过终端模拟器进入命令行

另外一种进入命令行界面的方法是使用终端模拟器。在不同的操作系统中,可以选择的终端模拟器程序也有所不同(参考 ref(term) 节)。本书作者在 Linux 下常用 rxvt-unicode,macOS 中则使用 iTerm2。

一般而言,终端模拟器程序会跟系统的登录 Shell(或称默认 Shell)绑定在一起。有些终端模拟器程序提供了更改 Shell 的特性,从而使用户可以方便的选择自己惯用的 Shell。如果不能从终端程序中直接更改 Shell,那么也可以通过 chsh 命令来改变登录 Shell。假如我们想把默认 Shell 更改成 zsh,则可以执行以下命令:

xiaodong@codeland:~$ chsh -s /bin/zsh

怎么判断当前所用的 Shell 是哪一种呢?只需执行 echo $SHELL 即可。

你好,命令行

在《C 程序设计语言》中,作者 Brian W. Kernighan 和 Dennis M. Ritchie 介绍的第一个程序是在屏幕上输出一行“Hello world”的消息。为了说明命令行的使用,我们也将在屏幕上输出类似的消息——“你好,命令行”。

当我们进入控制台或打开终端模拟器时,通常会看到跟图 ref(fig:cli-prompt) 相似的命令行界面。

cli

从图 ref(fig:cli-prompt) 中我们可以看到命令行一般由下面几个部分组成:

  1. 当前登录的用户名称,在本例中是 xiaodong

  2. codeland 是主机名称,跟 hostname -s 的输出一致。

  3. 当前工作目录,~ 代表用户的主目录,在 Linux 系统下也就是 /home/<用户名>,macOS 中则为 /Users/<用户名>

  4. $ 为命令提示符。通常普通用户的命令行提示符与超级用户(root)的不同,以 bash 为例,root 用户的命令行提示符为 #

  5. 待执行的命令,在本例中是 echo -e "\t你好,命令行",除 echo 命令本身外,还包括该命令的选项(-e)以及参数(\t你好,命令行)等部分。命令的选项参数一般由引号(")引起,以避免诸如空格之类的特殊字符所导致的岐义。可以使用单引号(')或双引号("),但语意会不同。

除了这 5 个部分之外,在这个命令行中,我们还可以看到 @:、以及 ` `(空格)等字符。@ 一般用来分隔用户名和主机名,其形式跟电子邮箱地址一样。: 在这里起到提示说明作用。空格则常常用来分隔命令的选项和参数。因为命令行提示符可以定制,所以你的命令行界面可能跟我们在这里介绍的不同。

现在,请你跟我们一起,在命令行的提示符($#)后面输入 echo -e "\t你好,命令行"。如果在输入过程中有错误,不必慌张,按退格键(BackSpace)或删除键(Delete)删除后重新输入即可。当所有字符全部输入完成后,按下回车键(Enter)。

发现了什么?命令行向我们回显了一条“你好,命令行”的消息。而且 echo 命令参数中的 \t 在输出中产生了一个制表符(Tab),从而让消息有了缩进效果。

xiaodong@codeland:~$ echo -e "\t你好,命令行"
       你好,命令行

恭喜!你刚刚在命令行成功执行了一条命令,是否感觉并没有想象中那么恐怖呢?在后面的章节中,我们将教你如何更加高效的使用命令行,从而提升你的工作效率。