& 命令之后的“完成”消息不会立即显示,而是在用户操作之后显示。为什么?

& 命令之后的“完成”消息不会立即显示,而是在用户操作之后显示。为什么?

我执行了操作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 +mmonitor如果您不想看到此类消息,请( ) 删除它们。
  • set -b( notify) 立即显示消息。

相关内容