为什么在 GTK 命令末尾添加一个 & 符号会导致在 close 后的下一个命令中出现额外的输出?

为什么在 GTK 命令末尾添加一个 & 符号会导致在 close 后的下一个命令中出现额外的输出?

例如:

$ cd ~/code/someFolder
~/code/someFolder$ gitk --all& # 启动 gitk 的 gtk 窗口
[1] 9335 # 这到底是什么

现在我去 gtk 窗口内做一些工作,然后关闭它

~/code/someFolder$ echo ‘foobar’
福巴
[1]+ Done gitk --all # 这个额外的输出

我隐约感觉到,& 符号以某种方式“保持”了该​​过程,而在 gtk 中关闭它则会结束该过程并产生输出......但这是一个非常不科学的解释。

附言:抱歉,这个问题太难回答了,我想不出更好的方式来表达它。

答案1

您的问题中存在一些误解。首先,此行为不仅限于 Gtk 命令。其次,通知不是在“下一个命令”之后发送,而是在下一个提示时发送(例如,只要您键入 Enter 键)。

你正在做的事情被称为作业控制在 bash 中,你可以将命令发送到“后台”,这样它们就不会堵塞命令行。例如,尝试gedit在终端上运行。Gedit 的窗口应该出现,命令行应该被“阻止”,也就是说,除非关闭 Gedit,否则您无法输入任何新命令。

解决“长时间运行”进程的这种阻塞行为的方法是将其命令在调用时发送到后台。这样命令就不会阻塞,您将能够继续在命令行上工作。

将命令发送到后台的一种方法是使用&命令后的 。继续使用 Gedit 示例,您可以通过运行在后台启动它

gedit &

现在您将注意到命令提示符会立即打印出来,您可以运行新命令(这与gedit不带“&”符号的简单运行形成对比)。您还会注意到有关您刚刚创建的新“作业”的额外信息:括号中的作业编号及其 PID。

当作业结束时(正常或因为你终止了它),bash 将使用类似以下内容的通知你:

[1]+  Done                    gedit &

(这1是作业编号,右边是你创建这个作业的命令,以防你忘记:-)

如果后台有多个作业,您可以使用该命令jobs获取其状态的列表。

总之,除非您想立即运行另一个命令,否则不需要添加“&”符号。

有关作业控制的参考资料和其他有趣方面请阅读:

相关内容