像 Skype 和 Tixati 这样的程序可以直接从终端调用,而无需&
在调用结束时添加。为什么 Firefox 不是这样呢?我只是好奇我需要为哪些程序添加该&
选项。
答案1
这完全取决于软件的编写方式,通常还取决于软件的意图。
大多数 bash(= shell、终端)实用程序旨在“同步”使用,这些实用程序的执行是为了产生结果;这可能是脚本或手动过程中以下命令所必需的 - 如果实用程序(程序、软件)分离并立即让您停留在提示符下,您将不知道何时或是否可以使用结果。
Skype 通常不用作命令行“实用程序”,而是一个处理通信(电话或其他)的工具。如果从那里启动,它不会阻止终端,那么它就非常方便。
从终端分离:
https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely
答案2
所有程序都可以在不启用 的情况下调用&
。&
完全是可选的。 它所做的只是将进程发送到后台,以便您可以继续使用终端。
如果没有它,如果您从终端启动一个进程,则需要等到该进程完成(或关闭)后才能继续使用终端。因此,人们经常运行程序以将command &
它们发送到后台并继续在同一终端中工作。
有关各种 shell 操作符的更多信息&
以及它们的作用,请参阅这里。
答案3
程序将自身置于后台非常简单。执行此操作的代码可能非常简单,如下所示:
if (fork() > 0) _exit(0);
但默认情况下这样做会带来一些缺点。例如,您不能再将程序包装在脚本中,该脚本会在程序终止时执行某些操作。从后台进程向终端写入输出最终可能会看起来很混乱,后台进程的终端输出可以被禁用,但一旦后台进程尝试生成输出,它就会被冻结。
根据我的经验,Skype 和 Firefox 不会将自己置于后台。但它们会做一些不同的事情。
当你启动其中一个程序时,它们会检查是否已经有该程序的运行实例。如果已经有一个正在运行的实例,新实例将使用你刚刚提供的参数向正在运行的实例发送一条消息,然后退出。
这样做的效果是,已经运行的实例会执行某些操作,然后您会得到提示。