TL;DR 不,您不能捕获它们,因为它们不会产生信号,并且终端下的进程看不到它们,只能启发式地检测它们。但是,如果要能够在终端程序中使用这些键绑定,那么可以,您可以通过禁用终端对它们的特殊处理来做到这一点。
^q
并且^s
不会产生信号。这^z
不是^s
导致终端信令SIGSTOP
(编辑:实际上是SIGTSTP
)。
什么^s
是告诉终端不要读取正在写入它的进程的输出。这会导致进程在写入终端时阻塞(它们仍然可以写入其他地方并从标准输入读取,以及执行其他操作)[1]。^q
告诉终端继续读取和显示进程输出。将终端作为标准输入的进程看不到这些。终端看到键绑定,对其进行操作,并且不会将它们传递给从其终端设备读取的进程。
您可以使用 禁用此特殊行为stty -ixon
,然后使用 重新启用它stty ixon
。当我禁用它时,我键入时读取的进程说^s
是 byte 0x13
,并且^q
是 byte 0x11
。
[1] 作为展示这一点的实验,您可以打开 2 个终端窗口。tty
在第二个上执行以找到它的终端设备。然后,在第一个终端上,您可以作为第二个终端tee $TTY > $OTHER_TTY
的$OTHER_TTY
终端设备运行。完成此操作后,您可以点击^s
以阻止对终端的写入,并通过键入一些行来检查这一点。该行将显示在第二个终端中,但不会显示在第一个终端中,此后您输入的任何内容都不会显示在任何一个终端上,直到您点击^q
。这里发生的情况是,在您点击^s
并键入一行之后,tee
仍然可以读取它,并将其输出到我们重定向到第二个终端的 stdout。然后,当它尝试将其写入作为参数传递的第一个文件时,它被阻止,因为它是您阻止的终端^s
. 它呆在那里等待write()
返回,直到你击中它才会返回^q
。