译:Linux 中的 TTY 是什么

原文链接:What is a TTY on Linux? (and How to Use the tty Command)

tty命令是干什么的?它打印出你正在使用的终端名。TTY 代表 “电传打字机(teletypewriter)”。 这个命令名字背后的故事是什么?这需要更多解释。

19世纪的电传打字机

在19世纪30年代至40年代,称为电传打字机的机器被开发出来。这些机器可以将输入的消息通过“线下(down the wire)”传输到遥远的地方。消息是由发送者在各种键盘上输入的。它们在接收端被打印在纸上。它们是电报中的一个进化步骤,在以前是通过摩斯电码和类似的编码进行传输。

消息被编码和传输然后被接收、解码和打印。有数种技术被用于编码和解码消息。其中最著名、最多产的一项专利是1874年由埃米尔·博多(Émile Baudot)获得的,波特率(baud rate)就是以他的名字命名的。他的字符编码方案比ASCII早了89年。

最终,波特的编码成为了在电传打字机编码中最接近标准的编码,他被大多数厂商采纳。波特原始的硬件设计只有5个按键,就像钢琴键一样。操作者被要求为每一个字母学习特殊的按键组合。最终,波特编码系统被结合进了传统的键盘布局。

为了纪念这个进步,这个机器被命名为电传打字机(teletypewriters)。这被缩短为teletypes并且最后称为TTYS。这就是TTY这个首字母缩写的由来,但是电报和计算机有什么关系?

ASCII 和 电报

当 ASCII 于1963年问世时,它被电传打字机制造商采用。尽管电话被发明和得到了广泛的使用,电传打字机依然在发展。

电报是一个世界范围的电传打字机网络,可以将书面消息发往全球。在第二次世界大战之后到1980年代传真机火热期间,它们是传输书面消息的主要手段。

计算机也不断发展。他们变得能够与用户实时交互并且能够支持多个用户。老旧的批处理方法变得无法满足需求。人们步希望等待24小时或更久来得到结果。制作一堆打孔卡带然后等上个几夜来获得结果已经无法接收。

人们需要一个设备能够让他们输入指令并且直接返回结果给他们。人们想要效率。

电传打字机的新用途

电传打字机是一个完美的输入/输出设备选择。毕竟他是一种能够打字,编码,发送,接收,解码和打印的设备。

电传打字机关注如果连接在另一端的设备不是另一个电传打字机吗?只要它使用相同的编码语言并且能够接收并发送消息回来电传打字机就很开心。

当然,它也多少使用了标准键盘。

硬件模拟的电传打字机

电传打字机成了那个年代与微型计算机和大型计算机的默认方式。

他们最终被使用电子模拟这些机电器械的设备所取代。这些设备使用阴极射线管(Cathode Ray Tubes (CRTs))而不是卷纸。当计算机传输响应时,他们不会抖动。他们允许使用至今无法实现的功能,例如在屏幕周围移动光标,清空屏幕,加粗字体,以及更多。 [ They were eventually replaced by devices that emulated those electro-mechanical machines using electronics. These had Cathode Ray Tubes (CRTs) instead of paper rolls. They didn’t shake when delivering responses from the computer. They permitted hitherto impossible functionality, such as moving the cursor around the screen, clearing the screen, bolding text, and so on. ]

DEC VT05 是虚拟电传打字机的早期示例,并且是著名的 DEC VT100 的祖先。DEC VT100 被售出了数百万台。

软件模拟的电传打字机

在 Linux 和其他类 Unix 操作系统例如macOS的桌面环境中,终端窗口和例如 x-term 和 Konsole 的应用程序是虚拟电传打字机的样例。但是这些是完全从软件层面实现的他们被称为伪电传打字机(pseudo-teletypes),缩写为 PTS。

这就是 TTY 的由来。

TTY 能告诉我们什么

在 Linux 中有一个伪电传打字机多路复用器(pseudo-teletype multiplexor)来处理来自终端窗口伪电传打字机(PTS)的连接。这个多路复用器是 master,PTS是 slave, 多路复用器由内核通过位于 /dev/ptmx 下的设备文件进行寻址。

tty 命令将打印你的使用了 master 接口的 slave 伪电传打字机的设备文件名称。[The tty command will print the name of the device file that your pseudo-teletype slave is using to interface to the master.] 实际上这就是终端窗口的编号。

让我们看看 tty 为我们的终端窗口报告了什么:

1
tty

tty

这个响应显示我们连接到了位于 /dev/pts/0 的设备文件。

我们的终端窗口,是电传打字机(TTY)的软件模拟,以伪电传打字机(PTS)的方式连接到伪电传打字机多路复用器。并且编号正好是0。

静默选项

-s(silent) 选项可以让 tty 不产生输入

1
tty -s

tty -s in a terminal window

它会产生一个退出码,如下:

  • 0: 如果标准输入来自模拟的或物理的 TTY 设备。
  • 1: 如果标准输入不是来自 TTY 设备。
  • 2: 语法错误,使用了错误的命令行参数。
  • 3: 发生了写入错误。

这看上去似乎在 Bash 脚本中最有用。但是即使在命令行,我们可以也演示如何只使用终端窗口(TTY或PTS会话)时执行命令.

1
tty -s && echo "In a tty"

tty -s && echo "In a tty" in a terminal window

因为我们运行在 TTY 会话中,我们的退出码为0,并且第二条指令已经执行。

"In a tty" in a terminal window

who 指令

有其他命令可以显示你的 TTY 编号。 who 命令将会列出包含你自己的所有登陆 的用户信息。

Alec 和 Mary 正在远程连接这台 Linux 电脑。 他们连接到了 PTS 1 和 2。

用户 dave 显示正连接到 “:0” 。

这代表了屏幕和键盘物理的连接到了这台电脑。尽管屏幕和键盘是硬件设备,他们依然通过设备文件连接到了多路复用器。 tty 显示这是 /dev/pts/2

1
2
3
who

tty

who command

访问 TTY

你可以通过按住 Ctrl+Alt 加上一个功能键来访问全屏的 TTY 会话

Ctrl+Alt+F3 将会显示 tty3 的登陆提示。

tty3

如果登录并执行 tty 命令,您将看到已连接到 /dev/tty3

这不是伪电传打字机(软件层面模拟);他是一个虚拟电传打字机(硬件层面模拟)。它通过屏幕和键盘连接到你的电脑,并且模拟了一个虚拟电传打字机就像 DEC VT100 所做的一样。

你可以使用功能键 Ctrl+Alt 配合上功能键 F3 至 F6 可以选择4个 TTY 会话。例如你可以登陆进 tty3 并且按下 Ctrl+Alt+F6 来切换到 tty6 。

tty6

想要回到图形的桌面环境需要按 Ctrl+Alt+F2

Ctrl+Alt+F1 将返回图形桌面会话的登录界面。

Ctrl+Alt+F1Ctrl+Alt+F6 将打开全屏TTY控制台,而 Ctrl+Alt+F7 将使您返回图形桌面环境。如果你使用旧一点的 Linux 发行版,则取决于你系统的行为。
This was tested on current releases of Manjaro, Ubuntu, and Fedora and they all behaved like this:
这已在 Manjaro , Ubuntu 和 Fedora 的当前版本上进行了测试,他们所有的行为如下:

  1. Ctrl+Alt+F1: 返回图形桌面环境的登陆界面。
  2. Ctrl+Alt+F2: 返回图形桌面环境。
  3. Ctrl+Alt+F3: 打开 TTY 3。
  4. Ctrl+Alt+F4: 打开 TTY 4。
  5. Ctrl+Alt+F5: 打开 TTY 5。
  6. Ctrl+Alt+F6: 打开 TTY 6。

通过访问这些全屏控制台,允许仅通过命令行安装的 Linux 的人 并且许多 Linux 服务器通过这种方式配置 能够使用多个控制台。

你曾使用带图形桌面环境的 Linux 机器工作并被一些问题让你的会话冻结吗?现在你可以跳到 TTY 控制台其中一个会话来尝试纠正这些问题。

你可以使用 topps 来尝试定位出错的应用,然后使用 kill 来终结它,或者使用 shutdown 直接以计算机允许的方式尽可能优雅的关掉计算机。

历史悠久的三封信

tty 命令因为19世纪晚期的设备得名,并在1971年出现于 Unix 上, 并且至今作为 Linux 和类 Unix 操作系统的一部分。

这个小东西的背后有一个传奇。