我只是想在 Mac 上的 bash 终端中自学 GNU/Linux 风格的命令和工具。
我希望终端在后台进程完成时自动显示。我没有运行特定的程序,但是,例如:
sleep 10 &
sleep
完成后我如何(或者甚至可能)让它自动显示在命令行中。还是我只需要手动检查?
答案1
set +b
默认模式。在此模式下,每次bash
要打印提示时,它首先检查是否有任何后台作业已停止或终止,如果是,则在显示提示之前打印通知消息。
set +b
永远不会损坏显示器,但它也有自己的问题。特别是,假设您正在测试一个 GUI 程序,您正在单独的编辑器窗口中编辑其源代码。 (假设它是用解释性语言编写的。)您可能有一个终端窗口,您可以在其中不断键入相同的命令myprogram &
.每次您对程序进行更改并想要重新启动它时,您都需要关闭它的当前实例,并在 shell 窗口中重复此命令。现在bash
将在打印旧程序已完成的通知之前启动程序的新实例 - 因为打印该通知是作业编号分配重置的时刻,这也意味着您的作业编号将无限制地增加,除非您故意在没有后台作业运行时按回车键。最终,程序的一个实例将挂起,您将不得不键入kill %134
,而不是kill %1
您想要的。
set -b
在此模式下,当任何后台作业停止或终止时,bash
都会收到 SIGCHLD 信号,并且其信号处理程序会立即显示通知消息 - 即使bash
当前正在等待前台进程完成。
set -b
不知道终端的状态,因此它的通知可能会破坏您可能正在运行的任何全屏应用程序(例如文本编辑器或 MUA)的显示。特别是,这种模式甚至无法与bash
自己的命令行编辑进行明智的交互!尝试sleep 1 &
在此模式下运行,然后立即开始键入命令行。您会发现,当打印通知时,显示会处于一种不太明显的状态。
这一切的来源已找到这里。
答案2
默认情况下,bash
通常设置为仅在命令提示符准备好显示时告诉您后台作业已更改状态。
您可以将此同步通知启用为与 异步set -b
。但它并非没有缺点 - 例如,如果您当前正在输入命令,它没有光标行位置的概念。
顺便说一句,当您学习命令行工具时,请注意 Mac 上安装的工具与 GNU/Linux 发行版上同名的工具有细微的差别(有时不是那么细微的差别)。