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

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

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

sleep 2 &

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

答案1

在子 shell 中运行命令:

(sleep 2 &)

答案2

执行 shell 内置功能:

$ set +m

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

尽管在子 shell 中运行如下命令:

$ (sleep 2&)

...将要禁用该消息,它起作用的唯一原因是监控模式默认只对交互式 shell 启用。也就是说,子 shell 通过运行具有自动“设置 +m”。

答案3

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

set +m
sleep 2 &
set -m

并且在最终结束后睡眠set -m,您仍然会收到完成消息。

如果您想要禁用单个命令调用的消息,(sleep 2 &)那么可以使用子shell技术。

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

答案4

无子壳,您可以执行以下操作:

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

基于这个答案

相关内容