避免 SIGINT
node
CTRL-C通过取消设置其中断字符VINTR
(通常)来更改 的含义, CTRL-C以避免它本来会得到的中断信号。
启动后,一直处于休眠状态,直到您的终端或eg 使用rlwrap
的伪终端 ( ) 发生某些事情。这个“东西”可以是你的按键,也可以是.pty
node
node
每次发生这种情况时,都会将s 终端设置(包括)rlwrap
复制到自己的 tty。nodes
VINTR
但是,如果node
仅更改其终端设置,则它本身不会唤醒rlwrap
,从而将旧设置保留在自己的 tty 上。透明度将被打破:当您按下CTRL-C rlwrap
时仍会将其解释为SIGINT
,而node
会理解.break
命令。
有一个特殊的、非常隐蔽的 pty
模式 ( EXTPROC ),它允许 pty master ( rlwrap
) 通过从站对终端设置的更改来唤醒,但这是非常不便携的。这就是为什么,从 0.41 版开始,rlwrap
有一个不太优雅的--polling
选项,它使它每 40 毫秒唤醒一次并复制从站的终端设置。
向前CTRL-C
从 0.43 版开始,rlwrap
即使在 readline 模式下,也可以通过将特殊键绑定到rlwrap-direct-keypress
in来直接转发特殊键~/.inputrc
:
$if node
"\C-c": rlwrap-direct-keypress
$endif
但是,node
仅CTRL+C当它本身使用 readline (尝试NODE_NO_READLINE=1 node
然后键入 CTRL-C)以了解我的意思时才给予特殊处理)
在这种情况下(即当一个命令进行自己的行编辑时),必须强制 rlwrap
进入 readline 模式:
$ rlwrap --always-readline node
这有一个不幸且不可避免的缺点,即无论何时命令要求单个按键 ( Continue? Y/N
),都必须键入一个额外的Enter.
然后还有上面勾勒的问题:如果终端的中断字符没有改变,node
将永远看不到CTRL-C(而是得到一个SIGINT
)
有两种解决方案。任何一个:
stty intr undef # disable interrupt character
rlwrap --always-readline node
stty intr '^c' # re-enable CTRL-C
或者:
rlwrap --polling --always-readline node # --polling means: continually wake up and wacth node's interrupt character
包起来
使长话短说:
- 添加
"\C-c": rlwrap-direct-keypress
到您的inputc
- 暂时取消设置终端的中断字符,或
rlwrap --polling --always-readline
如上使用
- 尝试使用额外的 Enter 进行单次按键操作