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

在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" 

但是输出是冗长的。 在第一行打印后台任务的作业ID和进程ID,然后输出命令,最后得到作业ID,状态和触发作业的命令。

有没有一种方法来抑制运行后台任务的输出,使得输出看起来和最后没有&符号一样? 即:

 $ echo "Hello I'm a background task" & Hello I'm a background task 

我要问的原因是我想运行一个后台进程作为tab-completion命令的一部分,所以这个命令的输出必须是不中断的。

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

 (echo "Hello I'm a background task" &) 

build立@贝壳的答案,这对我工作:

 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:~$ 

我不知道这个背后的原因,但是我从一个旧的post记得那个不在乎的地方阻止了bash输出过程id。

你将不得不围绕它与一个子壳或进程组(即{ ... } )。

 /home/shellter $ { echo "Hello I'm a background task" & } 2>/dev/null Hello I'm a background task /home/shellter $ 

IHTH

编辑

根据@Mark的downvote的提示,我研究了这在bash中不能正常工作。 这个工作如ksh93所示。

现在忙,但我会更新这个答案与我已经包含在这个意见和@Tizord的答案,但我没有看到一个简单的答案如何从后台任务redirectstd err。 (这可能与exec操作)

基于上述的答案,如果你需要允许stderr通过命令:

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

尝试:

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

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

很抱歉对旧post的回复,但我认为这对其他人很有用,这是Google上的第一个回复。

我遇到了这个方法(subshel​​l)和使用“等待”的问题。 但是,当我在一个函数内运行它时,我能够这样做:

 function a { echo "I'm background task $1" sleep 5 } function b { for i in {1..10}; do a $i & done wait } 2>/dev/null 

当我运行它时:

 $ b I'm background task 1 I'm background task 3 I'm background task 2 I'm background task 4 I'm background task 6 I'm background task 7 I'm background task 5 I'm background task 9 I'm background task 8 I'm background task 10 

在我收到提示信息之前,有5秒的延迟时间。

subhell解决scheme的工作原理,但我也希望能够等待后台作业(最后没有“完成”消息)。 $! 在当前的交互式shell中不能“等待”。 对我来说唯一的解决scheme是使用我自己的等待function,这非常简单:

 myWait() { while true; do sleep 1; STOP=1 for p in $*; do ps -p $p >/dev/null && STOP=0 && break done ((STOP==1)) && return 0 done } i=0 ((i++)); p[$i]=$(do_whatever1 & echo $!) ((i++)); p[$i]=$(do_whatever2 & echo $!) .. myWait ${p[*]} 

很简单。