我写这个问题是因为我试图使用 dmenu 启动一个名为 vimb 的网络浏览器,但首先通过一个名为 tabbed 的程序运行它。就上下文而言,vimb 是我喜欢的最小浏览器,但本身不支持选项卡。为此,我需要通过第二个名为 tabbed 的应用程序运行它。在正常的终端实例中,它工作得很好,如下所示:
tabbed vimb -e
但是,当使用 dmenu 运行相同的命令时,它会立即打开和关闭一个窗口。
附带说明一下,这样做也会弄乱我的一些脚本(也使用 dmenu)。例如,我有一个自定义脚本,其中列出了我的配置,我可以选择其中之一来打开一个全新的终端实例并编辑它们。在 dmenu 中运行上述命令时,这些脚本也会遇到类似的现象。在他们的例子中,他们打开一个终端实例,但立即关闭它。
我不知道我可以在系统的哪个位置检查发生了什么。挖掘/var/logs
对我来说也没什么帮助。
这里有人知道我可以从哪里开始解决这个问题吗?我记得很久以前在不同的窗口管理器中也遇到过同样的问题,所以我不相信是这样的。但我想知道大家的想法。
更新:所以我很好奇是否会产生某种我没有看到的错误。所以在 dmenu 中我跑了:
tabbed vimb -e >> ~/.foo
它只是......起作用了。谁能解释为什么会发生这种情况?
答案1
看起来发生的情况是命令是从 shell 运行的,并且应用程序在 shell 运行命令后终止。 '&' 告诉 shell 将进程置于后台,然后当 shell 正常存在时,它不会被杀死。
对于不需要继续运行的事情(例如切换设置或更改音量),您不需要执行此操作。或者对于可以自我妖魔化或检测它们已经像铬一样运行的应用程序。
有关“&”如何工作以及 shell 上的作业控制的更多详细信息。在您的 shell 上进行一些测试也应该是可行的。
tabbed vimb -e
如果您随后在同一 shell 中键入 Ctrl + c,则不应看到提示,它应该关闭窗口并给出新的提示。
现在尝试输入:
tabbed vimb -e &
您应该会看到一个新的 shell 提示符,并且退出 shell 不会终止浏览器。
(某些 shell(例如 zsh)处理 '&' 的方式与 bash 不同)