我执行了操作sleep 3 &
,“完成”消息显示为ps
命令的一部分,而不是显示在控制台上。不一定是这样ps
。完成后的任何命令sleep
都会在末尾有一个额外的行,并显示“完成”消息。这是为什么?
操作系统是centos-7.0,用vagrant下载。
[vagrant@localhost ~]$ sleep 3 &
[1] 2838
[vagrant@localhost ~]$ ps
PID TTY TIME CMD
1871 pts/0 00:00:00 bash
2838 pts/0 00:00:00 sleep
2840 pts/0 00:00:00 ps
[vagrant@localhost ~]$ ps
PID TTY TIME CMD
1871 pts/0 00:00:00 bash
2841 pts/0 00:00:00 ps
[1]+ Done sleep 3
[vagrant@localhost ~]$
如果我这样做,ls > ls.txt
“完成”消息不会进入文件。它显示在控制台上。如果我在 3 秒后单击 Enter,则会显示该消息。它在某种缓存中吗?会发生什么?
答案1
man bash
说:
The shell learns immediately whenever a job changes state. Normally,
bash waits until it is about to print a prompt before reporting changes
in a job's status so as to not interrupt any other output. If the -b
option to the set builtin command is enabled, bash reports such changes
immediately. Any trap on SIGCHLD is executed for each child that
exits.
答案2
这 ”完毕“消息不是由您执行的进程管理的,而是由其bash
本身来通知您后台作业的结束。这就是为什么它在存在某些控制台活动时提供消息的原因。
在 中bash
,您可以使用:
set +m
monitor
如果您不想看到此类消息,请( ) 删除它们。set -b
(notify
) 立即显示消息。