注意:以下内容适用于交互式 Bash 会话。在脚本中,作业控制消息从不打印出来。
有 2 个基本场景用于使 Bash 的作业控制消息静音:
一劳永逸:
CodeGnome's helpful answer answer 建议 将后台命令包含在一个简单的子 shell 中 - 例如,(sleep 10 &) - 这有效地使工作控制消息静音 - 无论是在工作 creation 还是在工作终止。
这有一个重要的副作用:
-
通过使用控制运算符
& 在子shell中,您失去对后台作业的控制 - jobs 不会列出它,并且%%(最近启动的作业的规范(ID))和$!(最近启动的(作为其一部分)进程的PID)都不会反映它。[ 1]
对于一劳永逸的场景,这不是问题:
- 您只需启动后台作业,
- 然后您让它自行完成(并且您相信它可以正常运行)。
[1] 可以想象,您可以自己寻找进程,通过搜索正在运行的进程以找到与其命令行匹配的进程,但这很麻烦,而且不容易变得健壮。
稍后启动和控制:
如果您想继续控制工作,以便以后可以:
需要一种不同的方法:
-
以下处理创建作业控制消息的静音,但为了终止作业控制消息分类 ,您必须关闭作业控制 shell 选项:
-
set +m(set -m 重新开启)
-
警告:这是一个全局设置,具有许多重要的副作用,特别是:
- 后台命令的标准输入是
/dev/null 而不是当前 shell 的。
- 用于暂停 (Ctrl-Z) 和延迟暂停 (Ctrl-Y) 前台命令的键盘快捷键已禁用。
- 有关全文,请参阅
man bash 并(不区分大小写)搜索出现的“作业控制”。
-
要使创建作业控制消息静音,请将后台命令包含在组命令中,并将后者的stderr输出重定向到@987654332 @
{ sleep 5 & } 2>/dev/null
以下示例展示了如何在原则上保持对作业的控制的同时安静地启动后台作业。
$ set +m; { sleep 5 & } 2>/dev/null # turn job-control option off and launch quietly
$ jobs # shows the job just launched; it will complete quietly due to set +m
如果您不想要关闭作业控制选项 (set +m),唯一的方法就是让终止作业控制消息静音是 kill 工作或 wait 工作:
警告:有 两种极端情况这种技术仍然会产生输出:
- 如果后台命令立即尝试从标准输入读取。
- 如果后台命令立即终止。
安静地启动工作(如上,但没有set +m):
$ { sleep 5 & } 2>/dev/null
悄悄给wait:
$ wait %% 2>/dev/null # use of %% is optional here
悄悄给kill它:
{ kill %% && wait; } 2>/dev/null
额外的wait 是使 Bash 通常异步显示的终止作业控制消息(在实际进程终止时,杀死后不久)成为 所必需的wait 的同步输出,然后允许静音。
但是,如上所述,如果作业自行完成,仍会显示作业控制消息。