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。