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

wef*_*fa3 26 command-line shell terminal input special-characters

我只是偶然发现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
$
Run Code Online (Sandbox Code Playgroud)

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

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

Gil*_*il' 42

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修饰符并发送字符4or $
  • 终端发送一个转义序列,对按下的确切键和修饰符进行编码。
  • 终端发送一些其他控制字符。

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

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

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

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

^\ 退出

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

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

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

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

您可以使用该stty命令玩终端设置。

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


jim*_*mij 7

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

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28
Run Code Online (Sandbox Code Playgroud)

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

  • @JDługosz:Ctrl-V 告诉终端 *不* 解释以下字符。不幸的是,GUI 组合键已经接管了这些控制字符,造成了不必要的混乱。过去 Linux 使用 Alt-[Key] 作为 GUI 键(例如 Alt-C/Alt/V 用于复制/粘贴),但后来人们显然认为与 Windows 相同更重要;同时 Mac 用户仍然可以使用 Command 键而不是 Ctrl 键进行这些操作。 (2认同)