问题描述
因此,我在玩Zork 1时,我复制了一些文本以显示给我的一个朋友,但我不小心忘记了在按下CTRL
+ C
时按住Shift键。这停止了命令,我丢失了Zork数据…
“helpful”是否提供了一些提示,可以在按CTRL
+ C
键时用来阻止停止命令?
请注意,Zork在终端内部运行。这是一个terminal-based游戏,您在其中给出命令来执行不同的操作。
最佳解决思路
组合键Ctrl
+ C
发送字符^C
(字节值3)。这导致终端将SIGINT信号发送到在前台运行的程序¹。该信号的常规操作是中断当前命令:设计为处理连续命令的程序返回其顶级提示,而设计为单批命令或连续交互的程序退出。显然,您使用的程序是根据第二种模型设计的。
此signal-sending密钥是内核中通用终端接口的功能,由所有终端仿真器和实际物理终端共享。您可以使用stty
命令配置哪个键发送此信号,以及其他键(最著名的是Ctrl
Z
发送SIGSTOP以挂起前台程序)。要将SIGINT的密钥切换到Ctrl
+ _
(在当前端子中):
stty intr '^_'
完全禁用它:
stty intr ''
要将所有设置重置为默认值:
stty sane
键不能是任意键组合,它必须是一个单字节值。程序可以覆盖stty
设置-某些程序(尤其是full-screen文本模式程序)会执行自己的键盘快捷键处理。
¹More precisely,用于foreground process group中的所有进程,其终端为controlling terminal。
次佳解决思路
CTRL
+ C
向前台作业发送中断信号(SIGINT
,信号编号2)。您可以在启动Zork之前使用trap '' 2
命令通过”trapping”禁用该信号。
Re-enable CTRL
+ C
(未捕获SIGINT
)与trap 2
。
提示:您可以在~/.bashrc
中添加类似的内容:
alias zork="(trap '' 2 && cd ~/path/to/zork/ && frotz ZORK1.DAT)"
这样,您将永远不会忘记禁用信号和re-enable,并且只需在终端中键入zork
即可轻松开始游戏。
注意:如果更方便,则可以使用信号名称代替数字,即trap '' sigint
或trap '' int
。我只是习惯使用数字,例如在kill -9
等中。