Ubuntu 中真正令人讨厌的是,当一些不需要多个实例的应用程序(例如“外观设置”、Web 浏览器、终端窗口)在启动时会再次加载。对于浏览器或终端,我仍然可以理解,尽管此类应用程序有“新窗口”选项。但对于设置应用程序,例如“外观”或“键盘设置”的多个实例完全没用。
如何防止启动器再次启动已经启动的应用程序(例如 Firefox)?
我尝试了一个名为 launch.sh 的 shellscript:
#!/bin/sh
if ! pgrep $1 >/dev/null; then
"$2" &
fi
在 Firefox 的 xfce 启动器中我设置
launch.sh firefox /usr/bin/firefox
它确实有效(当区域打开时,firefox 不会启动),但xfce4-appearance-settings
它不起作用,因为pgrep xfce4-appearance-settings
当 xfce4-appearance-settings 打开时没有返回任何内容。
在 macOS 中它可以正常工作:此类应用程序仅启动一次,当再次单击应用程序图标时,它会移动到前台,而不是启动新的过时实例。
在 Ubuntu 中如何实现这一点?
答案1
应用程序本身控制该行为。
例如,对于 Firefox 来说,切换到正在运行的窗口,并且仅当程序未运行时才启动该程序,如下所示:
wmctrl -x -a firefox || firefox
在 bash 中,命令分隔||
符表示“OR”。第一个命令wmctrl
尝试切换到 WM_CLASS 为“firefox”的窗口。如果失败,firefox
则执行 。
第一个实例firefox
指的是 Firefox 窗口的 WM_CLASS。您可以在 的输出中看到正在运行的窗口的 WM_CLASS wmctrl -lx
。
要将其用作快捷键或在 .desktop 启动器中使用它,请使用以下命令:
sh -c "wmctrl -x -a firefox || firefox"
答案2
继续钒的答案,您可以制作一个通用的可执行文件,它可以对任何应用程序的.desktop
文件执行此操作,从而有效地为您提供随意的配置。
在您的主文件夹中创建一个文件。我将其命名为switch-to-if-open
。不需要扩展名。
touch switch-to-if-open.
在您选择的编辑器中输入以下内容:
#!/bin/sh
wmctrl -x -a $1 || "$@"
$1
是应用程序名称,并使用文件"$@"
中定义的所有其他参数运行完整命令.desktop
,包括域代码%u
(类似于Firefox 使用的URL )。
使其可执行:
sudo chmod +x switch-to-if-open
在您的.desktop
文件中(使用 Firefox 作为示例),在[Desktop Entry]
部分下,更改:
Exec: firefox %u
到:
Exec: /home/${user}/switch-to-if-open firefox %u
在此处替换${user}
为您的用户名。
如果适用,您可能希望对文件[Desktop Action ...]
中的任何其他后续部分执行此操作。.desktop
如果你想让系统的所有用户都使用此功能,该文件应放置在/usr/local/bin
而不是您的home
目录。
如果你想避免引用完整路径,你应该能够将其添加到你的 $PATH 或创建一个符号链接。不确定.desktop
文件是否关心您在此处使用哪种方法。
您应该使用使用具有多个参数和/或字段代码的复杂命令的应用程序进行测试,以确保它们仍然按预期运行。我使用 GNOME 桌面,所以我使用了吉奥测试 URL(%u
字段代码)是否仍然通过。我相信exo-open可以在 xfce 中用于相同目的。