我在终端窗口中运行一个程序。我希望禁用Ctrl+Z快捷键来暂停该进程。
按下Ctrl+后Z,遗憾的是,该命令fg && set +m
仅在进程完成后才禁用作业控制。我可以set +m
在启动进程之前使用它,但我的问题是关于我已经启动进程并且需要禁用作业控制的情况。
答案1
基本解决方案
我希望禁用Ctrl+Z快捷方式来暂停该进程。
为此,您不需要禁用作业控制。告诉终端驱动程序不要在Ctrl+时发送 SIGTSTP Z:
stty susp ''
如果您已经启动了该过程,请按Ctrl+ Z,运行stty susp ''
(从现在开始Ctrl+Z不再是特殊的),然后运行fg
。
恢复Ctrl+的通常含义Z:
stty susp ^Z
为了方便起见,你可以将它们压缩为一行。在Ctrl+之后Z,即当进程停止时,调用:
stty susp ''; fg; stty susp ^Z
如果这对您不起作用,请继续阅读。
可能出现的问题,调整后的解决方案
通常,程序可以自行配置终端,因此(取决于程序)可能会发生这种情况:在您执行 之后stty susp ''; fg
,程序会重新配置终端(方式等同于stty susp ^Z
)。要战胜此类程序,您可以在stty susp ''
程序运行时从另一个终端运行,但要寻址原始终端。方法如下:
在原始终端中按Ctrl+Z停止程序。
调用
tty
。输出将类似于/dev/pts/6
或/dev/tty4
。fg
该程序,请稍等片刻。在另一个终端运行中
</dev/… stty susp ''
,您在原始终端中/dev/…
获得的确切输出在哪里。tty
笔记
当在 之后禁用将Ctrl+ “转换”为 SIGTSTP 时,+将导致一个字节(通常表示为)到达从终端读取的任何内容(在您的例子中:相关程序)。当终端截取该字节并将其“转换”为 SIGTSTP 时,这种情况通常不会发生(并且在 之后)。Z
stty susp ''
CtrlZ0x1A
^Z
stty susp ^Z
对于你来说,这意味着如果用户尝试Ctrl+Z那么就不会有 SIGTSTP (你想要的行为),而是会有输入这通常可能会导致程序产生一些(可能不想要的)反应。
还有
stty -isig
一个禁用对特殊控制字符的输入字符检查:INTR(通常^C
),QUIT(通常^\
)和SUSP(通常^Z
,问题正是关于这一点);stty isig
启用它们。请参阅man 1 stty
。