GUIDE TO UNIX AND LINUX (1-7)

本文是一篇读书笔记,主要介绍了 Linux 诞生的相关背景,以及一点点的 Linux 初步使用。
我选择性忽略了原书一部分内容,将我认为重要的部分摘录于此。
本读书笔记适合有一定 Linux 基础的朋友参考。

这是一篇语雀副本,用于同步我的个人博客。 > ^本文目前仅在语雀个人博客发布发布,内容为作者 tou 原创,暂不允许全文转载。谢谢!

Chapter 1 Summary

Unix 用起来容易,学起来难。

Unix 世界充斥巨量信息,不要试图全方位学习。学习基本知识(本书前 7 章),其它根据兴趣和需求学。

Chapter 2 What is Linux / Unix

Unix 是一种类型的计算机系统,Linux 是 Unix 系统中一个家族的名称。

2.1 什么是操作系统

一系列指令 = 程序 = 软件 vs 硬件

操作系统是软件,是高效利用计算机硬件的总控制程序。

所有 Unix 操作系统都有两个重要特征:

  1. 多任务
    • multitasking,旧称:多道程序设计(multi-programming)
  2. 多用户系统
    • multi-user,旧称:分时(time-share)

微软的 Windows 是“多任务、单用户”的操作系统!

计算机初始化过程只是引导(booting)过程的一部分。

引导(booting):通过自力更生出人头地。
此处利用其思想,将一个复杂、困难的目标从一个小动作开始,以其为基础,一步一步到达期望目标。
在计算机中,当启动计算机时,一个单独、小型程序的自动运行,这个程序启动另一个更复杂的程序,逐步递进……最终,操作系统(一个非常复杂的程序)接过控制,完成初始化过程。

引导过程的最后一个动作是启动一个非常复杂的程序:内核(kernel)

2.2 什么是内核

內核(kernel)是操作系统的核心。

内核基本上可分为两大类:

  1. 单内核(monolithic kernel):规模庞大的程序,可以完成所有事情。
  2. 微内核(microkernel):规模小,只能执行基本任务,通过调用服务器(server)完成其它功能。

内核执行的任务有:

  1. 内存管理(包括分页)
  2. 进程管理
  3. 进程间通信
  4. 输入/输出(通过设备驱动程序实现与物理设备的通信)
  5. 文件管理
  6. 安全和访问控制
  7. 网络访问(TCP/IP)

将 Unix 想象成为一个坚果
里面的就是果仁(kernel),外面的就是壳(shell)
shell(第 11 章)就是围绕内核周围的一种特殊程序(命令处理器)的名称,它充当用户与系统交互的个人界面。
内核之外并不只有 shell,还有其它辅助程序(如图形用户界面 GUI)。

设计操作系统可以选择大型单内核,或使用小型拥有最少服务器的微内核。

对于苹果的 OS X 系统来说,它使用的是微内核。微内核采用模块化设计,更易于定制迭代。

2.3 Unix = 内核 + 实用工具

2.4 ‘UNIX’ 商标的归属

原来在 AT&T,现由开放组织(The Open Group)拥有。

2.5 ‘Unix’ 现在是通用名称

2.6 自由软件基金会(Free Software Foundation, FSF, 1985)

“计算机用户应该能够自由地修改软件以适应自己的需求,并且自由地共享软件,因为帮助他人是基本的社会责任。”

可以对服务收费:“谈话免费,但啤酒不免费”。

Richard Stallman 从头编写,与 Unix 兼容的操作系统,他称之为 GNU。

GNU 全称 GNU’s Not Unix
这是一个可以套娃的名字:(((GNU’s Not Unix) Not Unix) Not Unix)

2.7 GNU 宣言摘录

2.8 GPL 和开放源代码软件

GNU 项目示例:C 编译器(gcc)、Unix shell(Bash)……

非营利版权(Copyleft):”Copyleft - all rights reversed”

通用公共许可证(general public license, GPL, 1989)的核心:允许查看源码、修改内容、但不许限制修改后的软件自由,GPL 协议确保新产品也在本协议下发行。

开放源代码运动影响深远、意义重大。如果所有开放源代码软件突然消失,那么 Internet 也会在一瞬间消失。因为全球大多数 Web 服务器都是由 Apache 的开放源代码程序运行的。

2.9 The 1970s, from Bell Labs to Berkeley

加利福尼亚大学伯克利分校的研究生 Bill Joy 的工作对 Unix 产生深远影响:开发了 vi 编辑器(第 22 章)、C-Shell(第 11-14 章)。

2.10 The 1980s, BSD and System V

美国国防部高级研究计划局(DARPA)给上述伯克利分校的一个大订单:开发一套 Unix 系统以运行在不同类型硬件上的操作系统,由此开发出了 BSD。

由于 AT&T 公司想要将 UNIX 变成商业产品销售,BSD 开发者开始替换 BSD 中 UNIX 的组件。

2.11 Unix in 1991: Waiting…

自由软件基金会(FSF)已经创建了很多高质量的自由软件:大量 Unix 实用工具和一个 Shell,但是他们还没有一个成型的内核。

此时,一位名叫 Linus Torvalds 的学生打算开始写一个自己的操作系统内核… just for fun

2.12 真命天子 Linus Torvalds

1991 年 9 月,Linus 发行了第一版的内核,称之为 Linux。

Linux 采用单内核的设计方式。

Linus 是以 GNU GPL 名义发布内核的,这使 Linux 飞快发展和完善。

“Given enough eyeballs, all bugs are shallow”

Linux 并不是 Linus 计划的用名。
另一程序员 Ari Lemmke 说服 Linus 将文件上传到自己运营的服务器上,从而可以使编程爱好者更方便的访问文件。在创建目录时, 他将目录命名为了 Linux。

2.13 Linux 发行版

严格意义上 Linux 是内核。

Linux 发行版(distribution,简称 distro)是基于 Linux 内核的操作系统,集成了所需的组件。

1993 年 7 月 Patrick Volkerding 发布新的发行版 Slackware,由于维护的好,它非常成功,且时至今日已经发展成为完整的发行版家族。

由于大多数 Linux 发行版使用的是 GNU 实用工具,因此 FSF 坚持基于 Linux 的操作系统应该称为 “GNU/Linux”,但就像 “UNIX” 一样,emmm

2.14 BSD 发行版

1992 年 Bill Jolitz 完成最后 6 个内核文件的内容重写,发布 386/BSD,这意味着 BSD 彻底与 AT&T 的 UNIX 无关了。

相比于拥有几百个发行版的 Linux,BSD 世界只有 3 个主要的发行版:

  1. FreeBSD:PC 硬件上操作系统版本
  2. NetBSD:移植到其他类型计算机
  3. OpenBSD:主要关注安全和密码学问题

事实上,大多数 Linux 发行版也使用了大量的 BSD 实用工具。

为什么 FreeBSD 没有 Linux 这么流行:

  1. 发布时间:Linux 早了一年(1992),解决了当时的燃眉之急(拥有完全开放源代码的操作系统)!
  2. BSD 许可证没有 GPL 严格:BSD 可以允许出现不共享新产品的情况存在。

2.15 您应该使用什么类型的 Unix

不必要必须使用什么类型的 Unix,Unix 就是 Unix,各发行版完全通用。

2.16 获取 Linux 或 FreeBSD 的方式

2.17 What is Linux / Unix

Unix = 类 Unix 内核 + 类 Unix 实用工具 + 类 Unix shell

我们无法准确定义一个“什么才算是类 Unix”的标准,但当你懂 Unix 时,你看到它,就知道它是了。

Linux 是任何使用 Linux 内核的 Unix 的名称。

Chapter 3 Unix connection

3.1 计算机 = 终端 + 主机

人与机器、机器与机器的交互通过界面(interface)实现。

在 Unix 中,由终端(terminal)提供界面(interface),它有两个主要任务:接受输入和生成输出。在此之外,其它的部件总称为主机(host)

人类通过眼睛、耳朵、鼻子、屁股和嘴等接受输入,通过四肢、面部肌肉、嘴等生成输出。
计算机通过键盘、触摸板、鼠标和麦克风等接受输入,通过扬声器、显示器等生成输出。
站在外星人的角度,人的终端和计算机的终端就是通过这些进行界面交互的。

3.2 价格昂贵的早期计算机

PDP-11,相对便宜的小型计算机。

这催生了多任务系统和多用户系统的实现。

3.3 多用户的实现:主机和终端的分离

TeleType,最早 Unix 终端,搭配 PDP-11。

Unix 是基于终端和主机这一思想的,终端充当界面,主机进行处理。它们可以彼此分离。

3.4 终端室和终端服务器

多用户系统只需满足:

  1. 每个人拥有自己的终端
  2. 终端与主机连接

终端室放满终端,每个终端都连接到同(一个)主机。

image.png

终端服务器(terminal server)充当交换机的角色,将任意终端连接到任意主机。

image.png

3.5 控制台

控制台(console)是特殊的终端,这台终端是计算机本身的一部分,它是用来管理系统的。

在当下,你使用一台安装 Linux 的笔记本电脑(laptop)时,尽管 Linux 支持多用户,但你就是唯一一位使用该计算机的用户。你就是管理员,也只有一台(内置)终端。在任何时候,当你面对 laptop 时,无论你实际管理系统还是仅在工作,你都在使用控制台。

为什么需要区分控制台和普通终端:

  1. Unix 系统总是区分控制台和普通终端的
  2. 有些事情只能通过控制台完成
    • 如系统启动过程遇到的问题只能通过控制台修复,因为在系统启动之后才可以通过远程终端访问系统
  3. 一些错误信息的日志会显示在控制台上

存在没有控制台的计算机(在了解 Unix 和网络后会解释)。

3.6 实现 Unix 连接

终端和主机的距离到底可以多远?无限远。

通过局域网(local area network, LAN)和互联网(Internet)即可实现无线连接。

只需要打开一个终端窗口并进行远程连接。

3.7 没有控制台的主机

没有控制台的计算机称为无头系统(headless system),它们不需要人类输入,当系统管理员完成工作(配置或修复)后,断开 Unix 主机,使其独立运行,比如:

  1. Web 服务器、电子邮件服务器等;
    • 接收数据(响应请求)和发送数据
  2. 路由器;
    • 将数据由一个网络中继到另一个网络,在 Internet 上,路由器提供网络之间的真正连接

拥有许多 Unix 服务器的大型公司,将每个主机的控制台连接到一台特殊的终端服务器上,通过这种方式,系统管理院可以使用终端服务器直接登录到有问题的计算机进行处理。

3.8 客户端/服务器关系

服务器(server):提供某种类型服务的程序

客户端(client):使用服务的程序

客户端/服务器关系的概念不仅在 Internet 上广泛使用,而且也是 Unix、Microsoft Windows 的重要部分。

示例:

  1. 上网:我们通过浏览器(Web 客户端)访问网站(Web 服务器)
  2. 收发电子邮件:使用不同系统
    1. 发送:使用简单邮件传输协议(Simple Mail Transport Protocol, SMTP)的系统,电子邮件程序临时成为 SMTP 客户端,并连接到一个 SMTP 服务器,请求并发送消息。
    2. 接收:使用邮局协议(Post Office Protocol, POP)消息访问协议(Internet Message Access Protocol, IMAP)的系统,电子邮件程序临时成为 POP/IMAP 客户端,并连接到一个 POP/IMAP 服务器,询问并接收邮件。
  3. 连接远程主机:通过 SSH(secure shell)在自己的终端上运行 SSH 客户端,并连接位于主机上的 SSH 服务器。
  4. 向远程计算机上传/下载文件:通过文件传输协议(File Transfer Protocol, FTP)的系统,在自己的计算机上运行一个 FTP 客户端,然后连接 FTP 服务器。

严格意义上,客户端和服务器都是程序,不是机器。但是,非正式的讲,“服务器”也可以指代运行服务器程序的计算机。

3.9 按下键盘按键时发生的事情

键盘和鼠标的操作都不是界面(终端)处理的,而是主机处理完通知界面产生对应变化的。

当连接远距离主机时,可能会产生延迟(lag)。

Unix 的设计目的是让许多不同的终端一起工作,因此操作系统本身统一方式处理按键才有意义,而不是让不同类型的终端以自己的方式处理按键。

3.10 字符终端和图形终端

使用图形终端时,可使用一个成熟的图形化用户界面(graphical user interface, GUI)

图形终端一定比字符终端好吗?

  • 对于 Microsoft Windows 操作系统来说,是的,它的设计就基于 GUI,实际上也依赖于 GUI。
  • 对于 Unix 并不总是这样,它开发于字符终端时代,所有能力与功能都利用纯文本。事实上,大多数时候,文本就是我们的全部需求。

3.11 最常见类型的终端

现在终端的仿真都基于一个古老终端的特征:VT100(1978 年由 DEC 公司生产)。它设计优良,十分流行,为字符终端设立了一个永久的标准。

图形终端拥有不同标准,Unix 的 GUI 都基于 X Window 的系统,而 X Window 的基本支持由一个称为 X 终端的图形终端提供。

X 终端是图形终端仿真的基础,就如同 VT100 是字符终端仿真的基础一样。

为了连接一台远程主机并仿真一个字符终端,可以使用 ssh(secure shell)命令。

为了仿真一个 X Window 图形终端,可以使用 ssh-X 命令。

Chapter 4 Get Started With Unix

登录(login)

系统管理员(admin)

用户标识(userid)

口令(password)

<Return> 键是 Unix 一直保留下来的按键,表示结束一行的输入,它来源于最初的打字机。现在我们使用键盘上的 <Enter> 实现类似功能。

Microsoft Windows 被设计称大小写不敏感。相比之下,Unix 区分大小写,因此用户指令 “tou” 和 “Tou” 不是一回事。此外,对于命令 “logout” (注销命令)也同理( ≠”Logout” )。

password 不会回显,当 userid 不存在的时候,系统也不会提示用户不存在,系统只会返回最终结果: “Login incorrect”.

一件奇怪的事情:几乎在所有的 Unix 系统上,登陆程序引导提示(prompt)字符串 “login” 起始字母是小写的,而字符串 “Password” 的起始字母是大写的。

image.png

shell 提示

当初始化命令结束执行,Unix 将启动 shell 并将控制权交给它。然后 shell 显示 shell 提示,等候你输入命令。

三种流行的 shell 和它们的提示符:

  1. Bash ($)
  2. C-Shell ($)
  3. Korn Shell (%)

image.png

尝试一些命令:

  • date : 显示时间和日期,Unix 采用 24 小时制
  • whoami : 显示你的用户标识
  • w : 谁登陆了系统在做什么
  • last + {userid_here} : 最近几次(谁)登录的时间,如不指明 userid 则显示全部信息。

image.png

你可以使用命令 passwd 改变口令(密码)。

注销(logout)

结束使用 Unix:

  1. 使用键盘组合键 <ctrl> + <D> : 发送 eof(end of file)信号,这告诉 shell 不再有数据了,然后 shell 会终止。
    • 然而 eof 还有其它用途,这个组合键可能会使用户不小心注销,因此此功能可能会被屏蔽
  2. 使用 logoutexit 命令。

root

root 用户:超级用户,用户标识(userid)为 root,拥有全部权限

root 目录:整个 Unix 文件系统的基础

即便是管理员,也不会在非必要的时候使用 root 用户。

区分 root 用户的一个方法是查看标识符。root 登录后,无论是什么类型的 shell,统一会显示为 “#“.

Chapter 5 GUI: graphic user interface

X Window 的介绍略,Unix 主宰之争略。

抽象层次

从一开始,X Window 就被设计成 GUI 和硬件之间的标准化界面,就其本身而言还不提供图形化界面。实际上,提供图形化界面的是另一个程序:窗口管理器(window manager),它的抽象层次位于 X Window 之上。

桌面环境(desktop environment,有时称桌面管理器),其抽象层次位于窗口管理器之上,提供与现代计算机相关的复杂认知任务。

比如,在窗口管理器中我们可以处理鼠标的移动、窗口和图标的显示;桌面环境允许我们使用鼠标拖动图标(是桌面环境为拖放思想引入含义)。

抽象层次一览:
image.png

在特定层次中发生的事情的细节与其它任何层次无关。

仅相邻层次通过特定接口进行通信。

桌面环境

程序历史演变略。

Microsoft Windows 和 Mac OS 努力使人们相信计算机的每个程序都属于操作系统的一部分。

但是使用 Unix 时候,你就会看到真实的世界,并不是那样的。

常见桌面环境:

  • CDE:一般面向商业市场,被公司使用,因为它背后有稳定的技术支持。
  • KDE:消费者使用居多,简约有条理
  • Gnome:消费者使用居多,遵循“形式追随功能”(”Form ever follows function”, 1896, Louis Sullivan)的原则。

Chapter 6 working environment of Unix

从这章开始,将融合前面学习的许多知识,开始以 Unix 本来的方式学习 Unix。

多任务处理

在 Unix 中,我们不谈论程序的执行,而谈论进程(process)的执行。

进程(process)是装载到内存中准备运行的程序 + 程序的数据 + 跟踪程序状态所需的信息

你可以使用 top 命令查看当前系统活跃的进程。

进程的运行需要请求处理器时间。

单处理器的计算机一次只能执行一个进程,多处理器的计算机可以处理多个请求,但这仍不可能同一时间服务所有进程。

Unix 使用了这样一种系统,允许每个进程轮流使用处理器一段极短的时间的系统,这一段极短的时间称为时间片(time slice)。当时间片用完,当前进程就会被挂起,调度器(一个特殊的服务)会决定接下来执行哪个进程。

典型的时间片通常是 10 毫秒(10‰秒)

由于时间片极短、处理器非常快、调度器巧妙地处理了所有事情,因此看起来 Unix 同时处理了多个事情,到此为止,多任务处理的假象就这样产生了。

GUI 与 CLI

GUI = X Window + window manager + desktop environment

CLI(command line interface),即命令行界面。在这个界面上,shell(命令处理器)显示提示并等候你输入。

image.png

一般人们交谈的时候,并不总称 CLI,而是习惯称呼其为“命令行”,但事实上,CLI 就是 GUI 的对应物,你需要知道。

运行级别

典型的 Linux 运行级别:
image.png

大多数情况下,Linux 默认引导至级别 3(CLI)或级别 5(GUI),当出现特别严重的问题时,管理员才会调整至级别 1(此时仅允许管理员进行系统维护)。

默认引导级别可以自行修改(管理员授权),略。

学习使用 GUI

在第 5 章基础上有关 GUI 概念后继续讨论。

加速键(accelerator key)

加速键是 GUI 的标准功能,可以快捷地选择菜单、对话框选项,例如:

  • <alt> + <F> : 显示 File 菜单
  • <alt> + <E> : 显示 Edit 菜单
  • <alt> + <H> : 显示 Help 菜单

多任务

多任务切换的键盘组合键:

  • <alt> + <tab> : 顺序
  • <alt> + <shift> + <tab> : 逆序

桌面/工作空间

在 GUI 中,桌面(desktop)是基本的工作环境,也称工作空间(workspace)。一般而言,桌面环境提供 4 个不同的桌面,你可以使用快捷键切换。(不同 GUI 快捷键不一样)

终端仿真器

在 GUI 调出的“终端”,严格意义上应该叫做“终端仿真器”,它不是真正的 Unix CLI。

终端仿真器的启动方法通过:

  1. GUI 中的终端窗口
  2. 虚拟控制台

终端窗口是访问“终端仿真器”的一种方法,我们打开终端程序,它通过窗口形式出现,而且允许用户打开多个:

image.png

当你使用 ssh 程序连接远程服务器时,ssh 程序将充当终端仿真器。

当我们启动 Linux 时,可能默认引导启动 GUI。但实际上,Linux 同时启动了 7 个不同的终端仿真程序,它们就是虚拟控制台(这名字容易引起误解,叫做“虚拟终端”会更加合适,后面会说),其中 #7 就是图形终端,用来运行 GUI,所以我们看到的是 #7,而其它 6 个(都是 CLI)都不可见。

  • 从 #7 GUI 切换到其它 CLI(如第 4 个)的快捷键是 <ctrl> + <alt> + <F4>
  • 从 CLI 切换出去时,可以不用输入 <ctrl>(GUI 中可能会被占用,所以多一个快捷键)

事实上,虚拟控制台的优势是它占据整个屏幕、显示效果优于窗口,其次,它不依赖于图形化界面,也就是说,当一个终端出现问题崩溃,你可以快速切换到其它终端继续任务或修复。

实际上,FreeBSD 提供 8 台终端。

虚拟
在计算机领域,“虚拟”一词用来描述一些由软件仿真的对象,例如上述的“虚拟控制台”。另一个重要的例子是“虚拟内存”的思想,它利用硬盘存放超量数据的方式来模拟内存。
顺便提一嘴,Unix 系统使用虚拟内存。

控制台与终端

从物理上来说,控制台与其它终端一样。

系统管理员用控制台管理程序,因此控制台权限更高,当系统引导至级别 1(单用户模式)时,只有控制台是激活的,通过这种方式,其它用户不能登录系统。

现在,控制台(console)通常用作终端(terminal)的同义词,这是会令人迷惑的一件事情,例如刚刚的“虚拟控制台”,它实际上应该叫做“虚拟终端”,因为它本质上也是软件模拟出来的。

包括流行的 Konsole 终端仿真程序(德语中的 console),它运行时,得到的是一个终端窗口,而不是控制台。

复制与粘贴

复制粘贴:<鼠标选中源文字段> + <鼠标定位目标区域> + <鼠标中间键>

在 Linux GUI 中,你可以使用鼠标选中一段文本,然后在目标区域按中间键(即我们鼠标的滚轮按钮,有点奇葩是因为 Linux 默认有 3 个键),这就实现了粘贴。

复制、剪切、粘贴、撤销等快捷键与 Microsoft Windows 无异。

超级用户

成为超级用户:su

su: substitute userid (读音像 ess-you)

成为超级用户的方法:

  1. 登录的时候使用用户标识 root 和对应口令。
  2. 使用命令 su - root

注意方法 2 中的连字符!
su - rootsu root 有区别:

  • 共同点:
    • 都是 root 用户的权限;
  • 不同点:
    • su 仅仅取得 root 权限,工作环境不变,还是在切换之前用户的工作环境(原环境变量)
    • su - 是完全取得 root 的权限和 root 的工作环境(包括环境变量)

请对比如下两图:

image.png

image.png

事实上,su 命令允许你临时更改用户标识,挂起当前 shell。当你结束后,可通过 exit 命令退出,返回原来的 shell。

以超级用户执行 1 条命令:sudo

sudo: substitute the userid and do something (读音像 pseudo)

如果你的用户标识位于一个特殊的列表上(/etc/sudoers,仅被超级用户修改),那么才可允许使用 sudo 命令。这也是为什么当你使用 sudo 命令时,Unix 要求你输入的不是 root 用户的口令而是你自己用户标识的口令。

配置文件

使用 less + {路径/文件名} 浏览配置文件,它将展示第一屏的信息。

  • <Space> : 向前移动
  • <b> : 向后移动
  • <h> : 查看帮助(会介绍快捷键使用之类)
  • <q> : 退出浏览

一些配置文件和其功能:

  • /boot/grub/menu.lst:关于计算机上可以引导的操作系统信息
  • /etc/hosts:系统已知的一列主机名称和 IP 地址
  • /etc/inittab:不同级别的定义
  • /etc/passwd:每个用户标识的基本信息(实际口令加密,保存在其它地方)
  • /etc/profile:当一个用户标识登录时,系统自动执行命令

系统关闭与重启

命令 init

本质上就是改变运行级别。

此命令需在超级用户下使用:

  • sudo init 0 : 关机
  • sudo init 6 : 重启

显然,此命令不是为日常使用而设计的。

命令 reboot

sudo reboot : 重启,等价于将运行级别切换至 6

命令 shutdown

sudo shutdown now : 关机,等价于将运行级别切换至 0

此命令需指定何时关闭系统。

查看系统启动日志

当你登陆后,可以使用 dmesg 查看启动消息。

你会发现它一闪而过,内容很多,啥也没看清。此时你可以改变一下它展示的方式:dmesg | less,此时,你就可以像之间介绍的配置文件的查看方式,一页一页查看启动消息。

Chapter 7 Keyboard usage of Unix

Teletype 和 Unix 文化

最初的终端:Teletype

最流行的终端:VT100

最初的终端 Teletype 被称为 TTY 并且这一习惯被 Unix 一直保留下来。

使用与 TTY 相关命令:

  • tty : 查看自己的终端名称
  • stty : “set tty”,显示或改变终端的设置
  • getty : “get tty”, 打开一个终端通信,并启动登录程序

image.png

toulzx:在 centOS 7 中后两条命令似乎没有达到预期目的

显示工作目录(print working directory)命令:pwd

Unix 如何知道所使用的终端类型:环境变量

echo $TERM : 显示当前正在使用的终端的类型

image.png

printenv : 显示环境变量(”print environment variables”)

image.png

在 Unix 中,环境变量使用大写命名,这是传统惯例。

信号和键盘映射

使用特定信号控制正在运行的程序,例如 intr(interrupt,中断)的信号可以用来终止程序,而使用键盘组合键 <ctrl> + <C> 就可以发送 intr 信号。也就是说,在 Unix 中,<ctrl> + <C> 字符映射到了 intr 信号上,它们等价了。

换句话说,你可以使用 <ctrl> + <C> 终止一条需要花费长时间去完成的命令。

其它的键盘映射:

  • erase:删除最后一个键入的字符,键盘映射为 <Backspace>
  • werase:删除最后一个键入的单词,键盘映射为 <ctrl> + <W>
  • kill:删除整行内容,键盘映射为 <ctrl> + <U>(或是 <ctrl> + <X>

你可以使用命令 stty -a 显示所有的键映射。

image.png

若你只输入 stty,则默认只显示修改过的键映射。

你可能会发现 erase 信号对应的键映射是 ^?,这不是表示 <?> 键,而是在(以前)有些键盘上没有 <Backspace> 按键,<Delete> 键是 erase 信号的映射。 ^? 用来模糊表示退格键。(这里只是简略描述,详见 7.8 节)

你可以使用 stty {信号名称} {键盘映射} 修改键盘映射,比如:stty kill ^P,这表示将 kill 信号的键盘映射修改为 <ctrl> + <P>

修饰键:<ctrl>

使用键盘组合键 <ctrl> + <C> 就可以发送 intr 信号,其中 <ctrl> + <C> 的称呼在 Unix 中常用简化标识方法:^C(尖帽子和大写字母的组合),此后文章中我们使用这种表示方法。

其它修饰键

在标准 PC 键盘上,还有 <shift><alt> 修饰符。前者(shift)主要用于输入大写字母及双字符键中的顶部字符(上面一横排数字对应的字符),后者(alt)是新修饰符,当 Unix 被开发出来的时候,它还没出生… 所以 Unix CLI 中不需要该键,但是,GUI 可能会使用到!

停止程序

使用 ^C 发送 intr 信号,终止当前命令的执行。

一些程序被编程忽略 intr 信号,比如 vi 文本编辑器,这样做能防止误按退出,导致数据丢失。这样设定的程序往往有规定好的退出方式。

请区别!当键入一条命令后,intr 取消命令,而 kill 删除命令行上的所有字符。

另一种中断当前命令的信号是 quit,它的键盘映射是 ^\,其效果与 ^C 一致。在以前,它被程序员用来调试使用,因为它会额外生成一份内存副本,保存在磁芯文件(core file)中。现在有更好的调试工具了,一般不会这么用了(或:此信号可能不产生磁芯文件了)。

暂停显示

我们之前使用了 dmesg 显示系统启动中的所有消息。但是内容很多,一闪而过。我们使用 dmesg|less 使它每次只展示一页(/屏)内容。现在,我们使用 stop 信号使输出暂停,使用 start 信号使输出继续:

  • stop 信号的键盘映射是 ^S
  • start 信号的键盘映射是 ^Q (Qontinue,即 continue)

如果你的终端曾经神秘的卡住,可以试试 ^Q,它不会造成任何伤害。

More:
如果你的程序突然暂停,且看到类似 Suspended 或 Stopped 的消息,那么这意味着你可能不小心按下了 ^Z 键,它发送 susp(suspend,挂起)信号,程序因此暂停运行。此时你可以输入 fg(foreground,前台)命令重新启动程序。

shell 与 eof 信号

shell 程序读取 Unix 命令并解释命令。当用户在提示后键入命令并按下 <Return> 键,shell 处理命令,当处理完成,用户会重新接收到 shell 提示。

但当发送 eof 信号(end of file,键盘映射为 ^D),意味着你告诉 shell 已经没有数据需要再处理了,这回终止 shell 程序,即实现“logout”的功能。

你可以设置 shell 从而封闭 eof 信号,略。

命令行编辑

你可以使用 <Left><Right> 键移动光标修改特定位置的字符。(这是所谓的“非破坏性退格”,vs <Backspace>
你可以使用 <Up><Down> 键快捷显示并输入已运行过的历史命令。

返回与换行

旧时打印机器换行包括两个步骤:

  1. 打印头移到行首(对应 Unix 中 CR 信号)
  2. 打印纸向上移动一行(对应 Unix 中 LF 信号)

CR 信号的键盘映射是 ^M,LF 信号的键盘映射是 ^J

一般而言,Unix 中每行文本必须以一个新行字符(^J)结束。

然而,我们熟悉的 Microsoft Windows 不是这样的,它就是以 “^M^J” 结尾的。
所以有时候你复制别人的代码(当他使用的是 Mac,它的系统 OS X 基于 Unix)进入编辑器的时候,编辑器会提示你行尾字符的自动修改。

当按下 <Return> 键的时候,将发送一个返回字符(^M),Unix 会自动把返回字符修改为新行字符。

在终端上显示数据的时候,每一行,必须,以字符序列 “^M^J” 结束,因此,当数据发送到终端时,Unix 再一次将行末的新行字符(^J)修改为返回字符+新行字符。

因此向终端键入 ^J 或者 ^M 都能达到换行的效果。

重置

你可以使用 stty sanereset 命令将终端的设置恢复。

作者

tou

发布于

2021-12-10

更新于

2021-12-20

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×