wef*_*fa3 26 command-line shell terminal input special-characters
我只是偶然发现CTRL+ 4 关闭stdin从命令行读取输入的程序。
这是我 在程序阅读中键入CTRL+4或CTRL+时的样子/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
终端发送字符(或更准确地说是字节),而不是键。当按下代表可打印字符的键时,终端将该字符发送到应用程序。大多数功能键被编码为转义序列:以字符编号 27 开头的字符序列。一些Ctrl+形式的character键和一些功能键作为控制字符发送 - 在ASCII 字符集中,所有现代计算机用作基础(Unicode、ISO Latin- n等都是 ASCII 的超集),33 个字符是控制字符:字符编号 0 到 31 和 127。控制字符不可打印,但旨在在应用程序中起作用;例如,字符 10,即 Control-J(通常写成 ^J)是一个换行符,因此当终端显示该字符时,它会将光标移动到下一行,而不是显示字形。转义字符本身是一个控制字符 ^[(值 27)。
没有足够的控制字符来覆盖所有Ctrl+character键和弦。只有字母和字符@[\]^_?有对应的控制字符。当您按Ctrl+4或Ctrl+ $(我认为是Ctrl+ Shift+ 4)时,终端必须选择要发送的内容。根据终端及其配置,有几种常见的可能性:
4or $。许多终端为数字行中的某些键发送控制字符:
我不知道这个特殊的约定是从哪里产生的。
Ctrl+|发送相同的字符,因为它是Ctrl+ Shift+\并且无论是否按下 shift 键,终端都会发送 ^\ 。
终端本身(更准确地说,是内核中的通用终端支持)专门解释一些控制字符。这种解释可以配置为映射不同的字符,或者被想要自己处理字符的应用程序关闭。一种众所周知的解释是,Return键发送的字符 ^M将当前行发送到应用程序,如果终端处于熟模式,应用程序将逐行接收输入。
几个字符向前台的应用程序发送信号。^C 发送中断信号(SIGINT),它通常告诉应用程序停止正在执行的操作并读取用户的下一个命令。非交互式应用程序通常会退出。^\ 发送退出信号(SIGQUIT),它通常告诉应用程序尽快退出而不保存任何内容;许多应用程序不会覆盖默认行为,即立即终止应用程序¹。因此,当您在or 中按Ctrl+ 4(或任何发送 ^\ 字符的东西)时,这两个都不会覆盖默认行为,应用程序将被终止。catbc
终端本身打印^\消息的一部分:它是您键入的字符的视觉描述,终端处于熟模式并打开回显(字符在您键入后立即显示在终端上,而不是非回显模式,其中字符仅发送到应用程序,应用程序可能会也可能不会选择显示它们)。这Quit部分来自 bash:它注意到它的子进程因退出信号而死亡,这是它让你知道的方式。
Shell 处理所有常见信号,因此如果您在 Shell 中键入 ^\,您不会终止会话,您只会得到一个新的提示,与 ^C 相同。
您可以使用该stty命令玩终端设置。
¹传统上会生成核心转储,但现在许多系统默认禁用它。
除了吉尔斯的回答让我补充一点,您始终可以使用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)。