在 Bash 中关闭监控模式

在 Bash 中关闭监控模式

重击man在小节下列出了如下描述的set选项-m

监控模式。作业控制已启用。对于支持它的系统上的交互式 shell,此选项默认处于启用状态(请参阅上面的作业控制)。后台进程在单独的进程组中运行,并在完成时打印包含其退出状态的行。

(要在链接页面上找到它,请搜索“监控模式”,只有一个命中。)

问题是这种模式是否可以有效地在 bash 会话期间关闭,如何关闭,以及预期的结果是什么?我一直在尝试尝试,但到目前为止还没有结果。

我知道这个命令set +m,但是它会导致什么?关闭作业控制?静音作业完成和终止消息?

答案1

set +m确实禁用监视模式(也称为作业控制),但这没有太大效果,而且其中大多数都不是有用的效果。当在关闭监视模式的情况下启动后台作业时,该作业不符合 和 的条件fgbg并且当作业终止、停止或恢复时,shell 不会执行打印消息或执行 SIGCLD 陷阱。

主要有用的区别是监视模式导致管道在自己的系统中运行进程组。当您想要终止整个进程组时,这是一个有用的考虑因素。如果禁用监视模式,则杀死 shell 的进程组也会杀死其子进程,如果启用监视模式,则每个管道都是其自己的组,并且可以独立进行组杀死。

bash-4.3$ 设置-m
bash-4.3$ 睡眠 1111 &
[1]17526
bash-4.3$ 设置 +m
bash-4.3$ 睡眠 2222 &
[2]17527
bash-4.3$ ps -o pid,ppid,pgid,sid,cmd 17526 17527
  PID PPID PGID SID CMD
175261752517526  7773睡觉1111
1752717525 17525  7773 睡眠 2222

答案2

要禁用监控模式,只需运行:

set +m

例如:

$ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
$ set +m
$ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments

相关内容