如何将作业带到前台然后在 bash 中禁用作业控制?

如何将作业带到前台然后在 bash 中禁用作业控制?

我在终端窗口中运行一个程序。我希望禁用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 ''程序运行时从另一个终端运行,但要寻址原始终端。方法如下:

  1. 在原始终端中按Ctrl+Z停止程序。

  2. 调用tty。输出将类似于/dev/pts/6/dev/tty4

  3. fg该程序,请稍等片刻。

  4. 在另一个终端运行中</dev/… stty susp '',您在原始终端中/dev/…获得的确切输出在哪里。tty


笔记

  • 当在 之后禁用将Ctrl+ “转换”为 SIGTSTP 时,+将导致一个字节(通常表示为)到达从终端读取的任何内容(在您的例子中:相关程序)。当终端截取该字节并将其“转换”为 SIGTSTP 时,这种情况通常不会发生(并且在 之后)。Zstty susp ''CtrlZ0x1A^Zstty susp ^Z

    对于你来说,这意味着如果用户尝试Ctrl+Z那么就不会有 SIGTSTP (你想要的行为),而是会有输入这通常可能会导致程序产生一些(可能不想要的)反应。

  • 还有stty -isig一个禁用对特殊控制字符的输入字符检查:INTR(通常^C),QUIT(通常^\)和SUSP(通常^Z,问题正是关于这一点);stty isig启用它们。请参阅man 1 stty

相关内容