CTRL+4(和 CTRL+\)在 bash 中起什么作用?

CTRL+4(和 CTRL+\)在 bash 中起什么作用?

我只是偶然发现CTRL+关闭从命令行 4 读取输入的程序。stdin

这就是当我在程序中输入CTRL+4CTRL+时的样子/stdin

$ cat
wefwef
wefwef
^\Quit
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
^\Quit
$

我得到^\Quit显示,然后程序关闭。这与使用^Cor相比有什么区别^D?有什么^\Quit作用?

编辑: 发现CTRL+\做了同样的事情。

答案1

Ctrl+4 发送 ^\

终端发送字符(或更准确地说是字节),而不是键。当按下代表可打印字符的键时,终端会将该字符发送到应用程序。大多数功能键都编码为转义序列:以字符号 27 开头的字符序列。一些Ctrl+形式的键盘character和一些功能键作为控制字符发送 - 在ASCII 字符集,所有现代计算机都使用它作为基础(Unicode、ISO Latin-n等都是 ASCII 的超集),33 个字符是控制字符:字符编号 0 到 31 和 127。控制字符不可打印,但旨在在应用程序中产生影响;例如,字符 10,即 Control-J(通常写作 ^J),是换行符,因此当终端显示该字符时,它将光标移动到下一行,而不是显示字形。转义字符本身是一个控制字符 ^[(值 27)。

没有足够的控制字符来覆盖所有Ctrl+character键和弦。只有字母和字符@[\]^_?才有对应的控制字符。当您按Ctrl+4Ctrl+ $(我认为是Ctrl+ Shift+ 4)时,终端必须选择要发送的内容。根据终端及其配置,有几种常见的可能性:

  • 终端忽略Ctrl修饰符并发送字符4$
  • 终端发送一个转义序列,对按下的确切键和修饰符进行编码。
  • 终端发送一些其他控制字符。

许多终端为数字行中的某些键发送控制字符:

  • Ctrl+ 2→ ^@
  • Ctrl+ 3→ ^[
  • Ctrl+ 4→ ^\
  • Ctrl+ 5→ ^]
  • Ctrl+ 6→ ^^
  • Ctrl+ 7→ ^_
  • Ctrl+ 8→ ^?

我不知道这个特殊的惯例是从哪里产生的。

Ctrl+|发送相同的字符,因为它是Ctrl+ Shift+ \,并且无论是否按下 Shift 键,终端都会发送 ^\。

^\ 退出

终端本身(更准确地说,内核中的通用终端支持)专门解释一些控制字符。这种解释可以配置为映射不同的字符,也可以由想要自行处理字符的应用程序关闭。一种众所周知的解释是 ^M(按键发送的字符)Return将当前行发送到应用程序,如果终端处于煮熟模式,其中应用程序逐行接收输入。

发送几个字符信号到前台的应用程序。 ^C 发送中断信号(SIGINT),通常告诉应用程序停止正在执行的操作并读取用户的下一个命令。非交互式应用程序通常会退出。 ^\ 发送退出信号(SIGQUIT),通常告诉应用程序尽快退出而不保存任何内容;许多应用程序不会覆盖默认行为,即立即终止应用程序。因此,当您在或中按Ctrl+ 4(或发送 ^\ 字符的任何内容)时,两者都不会覆盖默认行为,应用程序将被终止。catbc

终端本身打印^\消息的一部分:它是您键入的字符的视觉描述,并且终端处于烘焙模式并且打开了回显(字符在您键入后立即由终端显示,而不是非回显模式,其中字符仅发送到应用程序,应用程序可能会或可能不会选择显示它们)。该Quit部分来自 bash:它注意到其子进程因退出信号而死亡,这就是它让您知道的方式。

Shell 处理所有常见信号,因此如果您在 shell 中键入 ^\,您不会终止会话,您只会得到一个新提示符,与 ^C 相同。

您可以使用终端设置进行操作stty命令。

¹传统上会生成一个核心转储,但现在许多系统默认禁用它。

答案2

除了吉尔斯的回答之外,让我补充一下,您始终可以在 bash 中使用Ctrl-v+输入不可打印的字符key(在本例中为Ctrl-v+ Ctrl+4),并使用检查字符代码

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28

您将获得该字符的十进制代码,您可以检查该代码man ascii对应于文件分隔符 (FS)

相关内容