1.5 命令行界面

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

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

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

1.5.1 功能强大

让我们先来看一个例子:

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 个最常用的命令,并相应列出每个命令的使用次数和所占百分比。

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

1.5.2 灵活高效

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

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

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

1.5.3 能自动化

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

xiaodong@codeland:~$ ./script.sh