例如:
$ 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
获取其状态的列表。
总之,除非您想立即运行另一个命令,否则不需要添加“&”符号。
有关作业控制的参考资料和其他有趣方面请阅读: