防止bash在后台命令完成执行时显示“完成”


33

如果我在后台运行命令&,如下所示:

sleep 2 &

当命令完成时,我得到“完成”。我怎么能避免看到“完成”消息?

Answers:


33

子shell中运行命令:

(sleep 2 &)

请注意,通过使用它,您可以放松对调用者shell内部作业的控制(不jobs显示任何内容)。
mighq 2015年

34

执行shell内置:

$ set +m

这可以通过关闭“监视模式”来实现,因此shell不会报告终止后台作业。

虽然在子shell中运行命令,如:

$ (sleep 2&)

... 将禁用该消息,唯一的原因是因为默认情况下仅为交互式shell启用监控模式。也就是说,子shell通过运行具有自动“set + m”的额外shell来避免消息


4
应该注意,睡眠不会执行此输出。它的bash shell只是告诉你完成的后台工作。
flolo 2011年

8

我想澄清前两个答案。如果您想要的是永远不会看到shell中任何命令的Done消息,那set +m就是要走的路。只需将它放在.profile和/或.bashrc中即可完成。但请注意,如果您输入以下内容:

set +m
sleep 2 &
set -m

并且在决赛结束后睡眠结束set -m,你仍然会收到完成的消息。

如果要为单个命令调用禁用消息,则可以使用子shell技术(sleep 2 &)

set +m老实说,我只知道,所以+1给Wooble以启发我。但是,值得注意的是,您想要的两种解决方案中的哪一种取决于您要做的事情。


0

如果没有子shell,您可以执行以下操作:

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>-
    disown &>/dev/null  # Close STD{OUT,ERR} for silence if job has already completed
}

silent_background sleep 5

基于这个答案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.