当我在控制台登录屏幕上按向上箭头时,我得到 ^[[A 有什么原因吗?

Rub*_*vvy 45 linux login keyboard escape-characters console

每当我在控制台登录时,我都会up故意按箭头以查看以前键入的命令。但我看到了这一点^[[A

但是当我Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Win按键时没有回显任何字符。

背后的原因可能是什么?

^[[A某种字符是否意味着什么?

在此处输入图片说明

Gil*_*il' 26

键盘向计算机发送事件。事件表示“扫描代码 nnn 向下”或“扫描代码 nnn 向上”。在链的另一端,在终端中运行的应用程序期望以字符序列的形式输入。(除非他们请求原始访问,就像 X 服务器那样。)当您按下 时A,键盘会发送信息“向下扫描代码 38”。控制台驱动程序查找其键盘映射并将其转换为“字符a”(如果没有按下修饰键)。

当您按下不会产生字符的键或组合键时,需要根据字符对信息进行编码。一些键和组合键有对应的控制字符,例如Ctrl+A发送字符?(字节值1),Return发送字符?(Ctrl+M,字节值13)等。大多数功能键没有对应的字符,而是发送以?(escape, byte value 27) 字符开头的字符序列。例如,keyUp被翻译成转义序列?[A(三个字符:escape、开括号、大写 A)。

控制台上的用户名提示是愚蠢的,无法理解大多数转义序列。它没有您习惯的行编辑和历史功能:这些由 shell 提供,并且在您登录之前,您没有 shell。所以它只是显示转义序列。该?字符没有字形,因此显示为^[. 该^标志是传统上用作控制字符的前缀,逃避是^[因为它的字节值:它的字节值[,减去64。

如果您Up在 shell 提示符下按,这将向您的 shell 发送相同的 3 个字符序列。Shell 将其解释为命令序列(通常用于调用先前的历史记录项)。如果在 shell 提示符下按Ctrl+ Vthen Up,则会在提示符处插入转义序列:Ctrl+V是按字面意思插入下一个字符而不是将其解释为命令的命令,因此该?字符不会被解释为转义序列的开始.

有些键只是修饰符,不会传输到终端应用程序。例如,当您按下 时Shift,此信息保留在终端驱动程序中,如果您按下A,则会将其考虑在内,因此驱动程序将发送A到应用程序而不是a

此外,某些功能键可能未映射到您的控制台中。

对于 GUI 中的类似视图,请参阅什么是 bash 的元键?

  • 这是一个很好的答案,一如既往地感谢吉尔斯。 (2认同)

str*_*gee 21

这就是终端表示键盘发送给它的 Up 键的原始键码的方式。基本上,您的外壳程序通常会拦截按键,但在登录提示下没有什么可做的。因此,您键入的字符会像任何其他字母(或数字,或其他)一样打印到控制台。

  • @RubanSavvy Ctrl、Alt 和 Win(在 GNU/Linux 世界中通常称为 Super)是修饰符。如果你按下它们和一个键,你会在屏幕上看到不同的东西。我怀疑滚动锁是由内核或其他低级别的东西解释的,用于 tty 控制,尽管我不确定。上下翻页可能被“getty”或“login”吞没了,虽然我不知道为什么。有根据的猜测说,出于历史原因,内核特别解释了打印屏幕。不过,除了修饰符之外,我对任何内容都不是 100% 确定。 (3认同)
  • 以上可能应该被编辑到答案中。 (3认同)

Sno*_*ash 7

TLDR

您可能正在运行sh它输出按向上箭头键时生成的原始键码。

更高级的 shell 会bash拦截这些键码并用它们做一些事情。例如,显示其历史记录中的最后一个命令。

要解决您的问题,请键入bash以进入 bash shell。然后使用向上/向下箭头命令(注意,您的历史记录将在新 shell 中重新开始)。

  • 被低估的答案。 (2认同)
  • 这解决了我在 docker 容器中执行时的问题。只需使用 /bin/bash 而不是 sh。 (2认同)

ale*_*xis 6

这与“终端”(即终端模拟器应用程序)如何表示密钥无关。您看到的是用于向上移动一行的 ANSI 代码(ANSI 转义序列),但已转换为可打印形式。

  1. 键盘硬件发送“扫描代码”,但它们被翻译并作为字符呈现给命令行级应用程序。键A变为单个字节:A如果 Shift 键按下(或 Shift Lock),a否则。

  2. 在符合 ANSI 标准的终端中,箭头键不发送单个字符(ASCII 字符集中没有箭头代码),而是一个 3 个字符的“转义序列”:escape-[-A。其他三个箭头键是escape-[-B, C, D

  3. 如果发送(回显)到旧的物理 ANSI 终端,则相同的字符序列会将光标向上移动一行。许多程序,包括终端模拟器,识别这些字符序列并做一些适当的事情:终端模拟器将向上移动光标(这是curses库移动光标的方式),但bash会拦截它并滚动历史记录。

  4. 为了避免光标在没有用于在屏幕上移动光标的程序中的所有地方结束,您经常会看到键盘输入中的 ESC 显示为可打印序列^[(因为转义对应于control-[)。这实际上是由终端设备接口处理的;见stty(1)。因此,向上箭头将显示为^[[A。如果您键入cat、按回车键并按一些箭头键,您将在命令行中看到这一点。这也是您在控制台登录屏幕上看到的内容。

最后:ControlAlt和您提到的其他键不映射到字符序列。它们会影响另一个按键发送的字符(如上面的a/A示例),或者它们根本没有映射到文本。此类按键只能由侦听键盘事件的程序检测到。通过从标准输入读取(或写入文件)无法看到它们。