在后台运行bash命令而不打印作业和进程ID

Ale*_*ing 64 bash bash-completion

在bash中在后台运行进程非常简单.

$ echo "Hello I'm a background task" &
[1] 2076
Hello I'm a background task
[1]+  Done                    echo "Hello I'm a background task"
Run Code Online (Sandbox Code Playgroud)

但输出结果很冗长.在第一行打印后台任务的作业ID和进程ID,然后我们输出命令,最后我们有作业ID,它的状态和触发作业的命令.

有没有办法抑制运行后台任务的输出,使输出看起来与没有前后的&符号完全一样?即:

$ echo "Hello I'm a background task" &
Hello I'm a background task
Run Code Online (Sandbox Code Playgroud)

我问的原因是我想运行后台进程作为tab-completion命令的一部分,因此该命令的输出必须不间断才有意义.

Dim*_*lov 77

与完成无关,但您可以通过将调用放在子shell中来抑制该输出:

(echo "Hello I'm a background task" &)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想"等待"后台作业完成,你不能使用它. (11认同)
  • 谢谢,这绝对有效.不幸的是,当从bash-completion函数运行这样的脚本时,看起来bash在给出完成结果之前等待子进程完成.这是不幸的,因为这意味着似乎不可能通过bash-completion来触发后台工作程序. (2认同)

she*_*ter 11

你必须用子shell或进程组(即{ ... })来包围它.

/home/shellter $ { echo "Hello I'm a background task" & } 2>/dev/null
Hello I'm a background task
/home/shellter $
Run Code Online (Sandbox Code Playgroud)

IHTH

编辑

根据@Mark的downvote提示,我研究过这种方法无法正常工作{ ... }.这确实有效,如下所示{ ... }.

现在很忙,但是我会用这个和@Tizord的答案中的评论来更新这个答案,但我没有看到如何从后台任务重定向std-err的简单答案.(这可能与 { ... }操作有关)

  • 当我使用花括号时,输出的最后一行仍然显示(我不确定你为什么看不到它). (4认同)
  • @Mark:我刚刚对此做了一些快速测试,我发现问题是我继续使用“ksh93+”作为我的主要 shell。该代码按照 ksh 中的承诺工作。但由于 OP 带有“bash”标签,我理解你的 dv。查看@Tyzoid 答案的 bash 测试结果。祝你们好运! (2认同)

Tyz*_*oid 10

建立@ shellter的答案,这对我有用:

tyler@Tyler-Linux:~$ { echo "Hello I'm a background task" & disown; } 2>/dev/null; sleep .1;
Hello I'm a background task
tyler@Tyler-Linux:~$
Run Code Online (Sandbox Code Playgroud)

我不知道这背后的原因,但我记得一个旧帖子,disown阻止bash输出进程ID.


小智 6

基于上面的答案,如果你需要允许stderr来自命令:

f() { echo "Hello I'm a background task" >&2; }
{ f 2>&3 &} 3>&2 2>/dev/null
Run Code Online (Sandbox Code Playgroud)


mar*_*ite 5

尝试:

user@host:~$ read < <( echo "Hello I'm a background task" & echo $! )
user@host:~$ echo $REPLY
28677
Run Code Online (Sandbox Code Playgroud)

您已经隐藏了输出PID。请注意,您仍然可以从 $REPLY 中检索PID


Tom*_*ale 5

基于此答案,我想出了更简洁,更正确的方法:

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>/dev/null
    disown &>/dev/null  # Prevent whine if job has already completed
}
silent_background date
Run Code Online (Sandbox Code Playgroud)