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)
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的简单答案.(这可能与 { ... }操作有关)
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)
尝试:
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
基于此答案,我想出了更简洁,更正确的方法:
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)