五、管理终端
主要概念
讨论
控制终端
bash shell 及其运行的终端,是有经验的 Linux 用户使用的主要工具。这个课程专门有一整本教程讨论 bash shell 的强大功能。本课我们介绍终端共有的一些特征,和 bash shell 极有用的一项功能 - tab 补全功能(tab completion)。
复位终端
终端显示信息时,会逐字节显示。计算机在处理人可读文本时,通常使用 ASCII 格式将字符编码为整数字节值。虽然一个字节最多可以编入 256 个不同的值,只有一小部分(大约 100 个)用作文本字符和标点符号。其它值用来编码控制键组合和其它特殊情况。
有时,用户会不小心(或有意)指示终端显示格式没有被编码为 ASCII 文本的数据,如图像或可执行文件。终端会尽量执行,但经常出现的是乱码。更麻烦的是,终端可能会死在图形模式中,因此甚至应该是正常的 ASCII 文本看起来也不可读。
在这种情况下,reset 命令可将终端恢复到正常状态。通常当你使用这个命令时,你甚至看不到自己在键入它。但如果在一个不可读的 bash 提示下,输入 reset 然后点击 RETURN 键,可以把终端恢复到正常状态。
终端控制组合键
Linux 终端与它的原始前身,电传打字机和“哑终端”或 vt100 类型控制台,有许多相似之处。这些早期的设备有发送“特殊”信号或信号序列的机制,信号序列代表正常键入的字符流以外的一些事件,如:后退一格、换行、音 效或信息传递结束。Linux 终端和它的前身一样,使用 CTRL 键发送这些“特殊”信号。
下面的表格总结了所有 Linux 终端共享的许多常用控制组合键及其常见用法。在这个表格之后我们还会根据其适用性一步讨论这些控制组合键。
Table 1. Linux 终端控制组合键
组合键 | 符号名称 | 约定使用 |
CTRL-C | SIGINT | 非常规中断 - 终止前台进程 |
CTRL-D | EOT | 输入完成的正常信号 |
CTRL-G | BEL | 终端声效 |
CTRL-H | BS | 后退一格 - 删除前一个字符 |
CTRL-J | LF | 换行 - 与 RETURN 键功能相同 |
CTRL-L | FF | 换页 - 使 bash 清屏,使其它基于屏幕的程序“刷新”当前屏幕 |
CTRL-Q | 解冻终端显示(见 CTRL-S) | |
CTRL-S | 冻结终端显示(使用 CTRL-Q 解冻) | |
CTRL-U | NAK | 删除当前的行 |
CTRL-Z | SIGSTOP | 挂起前台进程 |
CTRL-C
CTRL-C 可能是最有用的组合键,帮助用户停止现在进行的工作。使用 bash shell 时,点击 CTRL-C 可以终止当前运行的进程,返回到 bash 提示。
设备节点 /dev/zero 是假设备,读取时会返回无数个(二进制)零。/dev/null 设备节点也是一个假设备,会删除任何写入其中的信息。因此以下命令会永远运行下去,读取零,然后删除。处于这种情况的用户可以使用 CTRL-C 取消这个命令。
[elvis@station elvis]$ cat /dev/zero > /dev/null
(... user types CTRL-C ...)
[elvis@station elvis]$
CTRL-D
在以后的教程中我们会谈到,许多 Unix 命令直接从键盘读取输入。但对于新的 Unix 用户来说,如何通知命令何时停止读取输入常常是不明显的。解决这个问题的办法是用组合键 CTRL-D。这组控制键向读取的进程传送“信息传递完毕”的信号(一般理解为“文件结束”)。
wc 命令在没有给出文件名作为参数的情况下,会对用户从键盘输入的行、词和字符进行计数。用户使用组合键 CTRL-D 表示输入结束。
[elvis@station elvis]$ wc
polly wants a cracker
polly wants a cracker
polly wants a cracker
(... user types CTRL-D ...)
3 12 66
[elvis@station elvis]$
命令 wc 会负责地报告,用户输入了 3 行,共有 12 个词,使用了66个字符。(这个功能现在可能没有用,但在以后的教程中我们还会学到更多的 wc 的用法。)如果用户使用 CTRL-C 又会怎么样呢?
CTRL-Z
组合键 CTRL-Z 用来挂起程序,挂起的程序可用 fg(“foreground”(前台))命令恢复。在进行 ftp 会话时,elvis 想要确认 shell 的当前工作目录。他使用 CTRL-Z 挂起正在进行的 ftp, 从 shell 运行 pwd 命令,然后用 fg. 恢复 ftp 会话。
[elvis@station elvis]$ ftp ftp.redhat.com
Trying 66.187.232.51...
Connected to ftp.redhat.com (66.187.232.51).
220 Red Hat FTP server ready. All transfers are logged. (FTP)
Name (ftp.redhat.com:elvis): anonymous
331 Please specify the password.
Password:
230 Login successful. Have fun.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
(... user types CTRL-Z ...)
[1]+ Stopped ftp ftp.redhat.com
[elvis@station elvis]$ pwd
/home/elvis
[elvis@station elvis]$ fg
ftp> ftp.redhat.com
ftp> ls
227 Entering Passive Mode (66,187,232,51,67,212)
150 Here comes the directory listing.
drwxr-xr-x 6 ftp ftp 4096 May 24 01:33 pub
226 Directory send OK.
...
以这种方式管理进程是相当复杂的,在以后的教程中我们会再讨论。现在我们只要知道 CTRL-Z 用来挂起、fg 用来恢复就可以了。
CTRL-U
CTRL-U 一般用来“擦除”当前的行。如果你所在的 bash 命令行错误繁多,你懒得修改,不如使用 CTRL-U 重新来过。如果你输入密码时弄错了,也可以使用 CTRL-U。因为输入的密码不会在屏幕上显示,有时很难知道到底输入了什么,很难改动,不如使用 CTRL-U 组合键重新来过。
CTRL-H
CTRL-H 和 BACKSPACE 的功能完全一样。但在有些终端上,BACKSPACE 键被错误的映像,不能正确工作。而 CTRL-H 几乎总是可以在这些情况下正常发挥作用。
CTRL-L
CTRL-L 传统上用来停止打印当前的页,开始下一页。如果使用在线终端,可以用它来刷新屏幕。对于许多基于屏幕的程序而言,包括 vi 和 nano 编辑器,如果意外的信息弄乱了显示屏,使用 CTRL-L 可以让程序刷新屏幕,正确地重绘屏幕。
在 bash shell 中,CTRL-L 指示 bash 清屏,但保留当前的命令行。
CTRL-Q
在 CTRL-S“冻结”屏幕后,CTRL-Q“解冻”屏幕(让它重新启动)。虽然在使用过 CTRL-Q 后,才能用这个组合键,我们先介绍它(作为更有用的命令)是因为,几乎没有人会故意使用 CTRL-S,但新的 Unix 用户有的时候会不小心点击 CTRL-S 组合键,不明白为什么他们的屏幕会冻结起来。如何你的机器出现死屏的现象,试着使用CTRL-Q 看能否解冻。
CTRL-S
见上一项 CTRL-Q
CTRL-J
几乎从来不用。(一般使用 RETURN 键。)
CTRL-G
唯一真正的用途是让终端发出响声。
识别终端
和其它设备相似,程序通过位于目录 /dev 的设备节点和终端在底层交流。比如说,使用设备节点 /dev/tty1 和第一个虚拟控制台交流。大多数进程记录启动它们的终端,用户的登录会话通常与他们使用的终端相关。在辨识这些终端时,终端用它的设备节点来代表,如 tty1。
在以下的摘录中,elvis 使用 who 列出一台机器上的当前用户,他还用 ps 列出从他的终端上运行的当前进程。在这两种情况下,终端都在列“TTY”中指定。
[elvis@station elvis]$ who
root tty2 Jun 21 10:12
elvis tty3 Jun 21 16:50
blondie :0 Jun 21 10:13
blondie pts/0 Jun 21 16:43 (:0.0)
blondie pts/1 Jun 21 10:14 (:0.0)
blondie pts/2 Jun 21 10:31 (:0.0)
blondie pts/3 Jun 21 10:39 (:0.0)
[elvis@station elvis]$ ps
PID TTY TIME CMD
4384 tty3 00:00:00 bash
4427 tty3 00:00:00 ps
Linux 将许多设备都当成终端,包括虚拟控制台、串行线连接的 VT100 终端、调制解调器等。以下的表格列出一些常用的终端设备的惯例名称。
Table 1. 终端设备名称
名称 | 设备 | 使用 |
ttyn | 虚拟控制台 | 使用 CTRL-ALT-Fn 组合键访问。 |
ttySn | 串口端口设备 | 连接到串行端口上的调制解调器或 VT100 类型。Unix 中的 ttyS0 等于 DOS 中的 COM1,COM2 等于 ttyS1,以此列推。 |
pts/n | 假终端 | 一个终端模拟,经常被 X 图形环境中的终端窗口或起始于网络的 shell (如 telnet 和 ssh )使用。假终端不能直接与物理设备相联系。 |
:0 | X 服务器 | X 服务器并不是真正的终端。当用户使用 X 图形环境的登录管理器登录时,其终端经常被列为 X 服务器本身。 |
tab 补全功能
tab 补全功能并不是终端的特征,而是 bash shell 的特征。输入命令和文件的名称时,能够熟练使用 TAB 键,可以节省很多时间和精力。
往 bash 命令行输入第一个词作为命令名的时候,输入你要执行的命令,在完成之前点击 TAB 键,会出现以下三种情况之一。
bash shell 尽量从所有可能的命令中帮你选择你正在输入的命令。在第一种情况下,只有一个命令是以你输入的字母开头的,bash 能够准确地找到你要执行的命令,帮你补全剩余部分。
在第二种和第三种情况下,不止一个命令是以你输入的字母开头的。bash 尽量补全命令,但是停下来发出“嘟嘟”的声音,提醒你还有其他的选择。要浏览 bash 已经帮你缩小了的选择范围,再次点击 TAB 键,bash 会显示所有以你输入的字母开始的命令。提供进一步信息,让 bash 能够肯定你所需的命令,再次点击 TAB 键,bash 会帮你补全命令。
下面我们来看一个例子。
用户 elvis 希望为他的终端启用 Unicode 模式。我们现在先不管 Unicode 模式是什么,或者他为什么要启用。你只需要知道启动 Unicode 模式的命令是 unicode_start,停止它的命令是 unicode_stop。他开始输入命令,然后点击 TAB 键。
[elvis@station elvis]$ unic<TAB>
bash 把这个词扩展为 unicode_st,然后发出“嘟嘟”的响声。为了看到可能的补全列表,elvis 点击了 TAB 两次。
[elvis@station elvis]$ unicode_st<TAB><TAB>
unicode_start unicode_stop
bash 显示两个以 unicode_st 开头的命令。elvis 要执行的是唯一以 unicode_sta 开头的命令,他输入 a,再点击 TAB。
[elvis@station elvis]$ unicode_sta<TAB>
bash 补全了命令,闪烁光标,以便可以开始为命令输入任何参数或命令行选项。
[elvis@station rha030]$ unicode_start
bash 不光能使用现有的命令完成命令行的第一个词,它还可以用文件系统中的文件帮你完成命令行的其它部分。例如,madonna 要查看文件 /etc/prelink.conf。她不需要输入文件全名,她可以只输入前面的部分,然后点击 TAB。
[madonna@station madonna]$ cat /etc/prel<TAB>
因为 /etc/prelink.conf 是唯一以 /etc/prel 开头的文件,bash 可以补全文件名。
[madonna@station madonna]$ cat /etc/prelink.conf
# This config file contains a list of directories both with binaries
# and libraries prelink should consider by default.
# If a directory name is prefixed with `-l ', the directory hierarchy
# will be walked as long as filesystem boundaries are not crossed.
# If a directory name is prefixed with `-h ', symbolic links in a
# directory hierarchy are followed.
-l /bin
-l /usr/bin
...
随着深入学习这门课程,花点时间熟悉 tab 补全功能,可以帮你节省很多时间和精力。用熟以后,使用 TAB 键会变成本能。一天下来,左手的小拇指因为不断敲击 TAB 键而变得酸痛。
Examples
浏览二进制文件后复位终端。
用户 blondie 无意中使用命令 cat 浏览了一个可执行文件 /bin/arch。由于这是一个编译型可执行文件,含有不应该在终端显示的字节,使她的终端变得乱糟糟的。
[blondie@station blondie]$ cat /bin/arch
ELF??414 (44???4????/lib/ld-linux.so.2GNU???y??6,?????aaa????aac????-?????[???
为了复位终端,blondie 盲打了 reset 命令,将终端恢复正常状态。
[blondie@station blondie]$
取消命令
用户 prince 觉得从根目录 / 开始递归地列出文件系统的内容会很有趣。
[prince@station prince]$ ls -R /
/:
bin data etc initrd lost+found mnt proc root sbin usr web
boot dev home lib misc opt rha RPMS tmp var
/bin:
arch cut gawk mail rm touch
ash date gettext mkdir rmdir true
ash.static dd grep mknod rpm umount
aumix-minimal df gtar mktemp rvi uname
awk dmesg gunzip more rview unicode_start
basename dnsdomainname gzip mount sed unicode_stop
bash doexec hostname mt setfont unlink
bash2 domainname igawk mv setserial usleep
...
他花了几分钟看文件,觉得看够了,就用 CTRL-C 取消命令。命令终止,他返回到 bash 提示。
[prince@station prince]$
练习
挂起终端输出
[Warning] 上机练习
练习目的:学习管理长时间运行的命令的终端输出。
Estimated Time: 5 mins.
具体操作
结果
A title
Question 1
Cleaning Up
检查你练习的结果后,使用命令 fg 把挂起的进程恢复到前台。使用控制键组合 CTRL-C 取消命令。
整理袜子。
[Warning] 上机练习
练习目的:学习如何有效终止从键盘上读取命令输入。
Estimated Time: 5 mins.
具体操作
你想在主目录下的文件 sorted_socks.txt 中生成一个列表,列出分类的袜子(按字母顺序排列)。
[student@station student]$ sort > sorted_socks.txt
yellow socks
dirty socks
cool winnie the pooh socks
(... type CTRL-D ...)
[student@station student]$ cat sorted_socks.txt
cool winnie the pooh socks
dirty socks
yellow socks
结果
A title
Question 1
问题
A title
Question 1
以下哪个命令会把终端恢复到正常状态?
Question 2
以下哪个控制键组合可以挂起命令?
Question 3
如果你见到一个完全没有反应的终端,以下哪个控制键组合会重新让它活动起来?
Question 4
如果你怀疑你输入了错误的密码,哪个控制键组合可以让你重头开始?
Question 5
如果你要取消一个产生太多输出的命令,哪个控制键组合最有用?
Question 6
如果你想冻结终端输出,以便晚些时候继续,哪个控制键组合最有用?
A.CTRL-C
B.CTRL-D
C.CTRL-L
D.CTRL-S
E.CTRL-U
Question 7
哪个控制键组合指示 bash 清屏?
A.CTRL-C
B.CTRL-D
C.CTRL-L
D.CTRL-S
E.CTRL-U
使用命令 who 的输出回答下列问题。
[prince@station prince]$ who
blondie tty2 Apr 21 22:07
elvis tty1 Apr 21 22:07
elvis tty3 Apr 21 22:07
root tty6 Apr 21 22:07
prince :0 Apr 21 21:50
prince pts/0 Apr 21 21:53 (:0.0)
prince pts/1 Apr 21 21:54 (:0.0)
prince pts/2 Apr 21 21:55 (:0.0)
madonna pts/3 Apr 21 22:08 (:0.0)
Question 8
用户 blondie 是如何登录企业版 Linux 机器的?
Question 9
用户 prince 是如何登录企业版 Linux 机器的?
Question 10
哪个用户以管理员根用户的身份登录?