像黑客一样使用命令行(2)
命令行界面
命令行界面(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 桌面系统。在它启动后就直接进入了桌面,那么此时想要进入控制台,可以按照下列步骤执行:
-
按 Ctrl + Alt + F1 组合键,进入编号为 1 的控制台。
-
按 Ctrl + Alt + F2 组合键,进入编号为 2 的控制台。
-
依次类推,可以分别进入 3 号、4 号、5 号、以及 6 号控制台。在默认情况下,Linux 一般提供 6 个控制台。
-
如果要从控制台返回到桌面,则可以按 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) 相似的命令行界面。
从图 ref(fig:cli-prompt) 中我们可以看到命令行一般由下面几个部分组成:
-
当前登录的用户名称,在本例中是
xiaodong
。 -
codeland
是主机名称,跟hostname -s
的输出一致。 -
当前工作目录,
~
代表用户的主目录,在 Linux 系统下也就是/home/<用户名>
,macOS 中则为/Users/<用户名>
。 -
$
为命令提示符。通常普通用户的命令行提示符与超级用户(root)的不同,以 bash 为例,root 用户的命令行提示符为#
。 -
待执行的命令,在本例中是
echo -e "\t你好,命令行"
,除echo
命令本身外,还包括该命令的选项(-e
)以及参数(\t你好,命令行
)等部分。命令的选项参数一般由引号("
)引起,以避免诸如空格之类的特殊字符所导致的岐义。可以使用单引号('
)或双引号("
),但语意会不同。
除了这 5 个部分之外,在这个命令行中,我们还可以看到 @
、:
、以及 ` `
(空格)等字符。@
一般用来分隔用户名和主机名,其形式跟电子邮箱地址一样。:
在这里起到提示说明作用。空格则常常用来分隔命令的选项和参数。因为命令行提示符可以定制,所以你的命令行界面可能跟我们在这里介绍的不同。
现在,请你跟我们一起,在命令行的提示符($
或 #
)后面输入 echo -e "\t你好,命令行"
。如果在输入过程中有错误,不必慌张,按退格键(BackSpace)或删除键(Delete)删除后重新输入即可。当所有字符全部输入完成后,按下回车键(Enter)。
发现了什么?命令行向我们回显了一条“你好,命令行”的消息。而且 echo
命令参数中的 \t
在输出中产生了一个制表符(Tab),从而让消息有了缩进效果。
xiaodong@codeland:~$ echo -e "\t你好,命令行"
你好,命令行
恭喜!你刚刚在命令行成功执行了一条命令,是否感觉并没有想象中那么恐怖呢?在后面的章节中,我们将教你如何更加高效的使用命令行,从而提升你的工作效率。