使用 xdg-open 启动可执行文件

使用 xdg-open 启动可执行文件

我正在尝试编写一个launchSystemFile像 Windows 一样ShellExecuteEx从命令行或从 C++ 运行的函数。

如果我ShellExecuteExablah.txt它会在默认编辑器中打开它。如果我ShellExecuteExafirefox.exe它会启动可执行文件。

我一直在用 C++ 做popen "xdg-open blah",除了可执行文件之外,它工作得很好。

有没有办法让xdg-open执行成为可执行文件?例如 Firefox 的路径/usr/lib/firefox/firefox

我尝试过xdg-open "/usr/lib/firefox/firefox",但失败并显示错误消息:

gvfs-open:/ usr / lib / firefox / firefox:打开位置错误:没有应用程序注册为处理此文件

答案1

xdg-open只是一个 shell 脚本,用于检测桌面环境并调用相应的程序(gvfs-open 用于 gnome、exo-open 用于 XFCE、mate-open 等)

因此,启动可执行文件的限制源自每个 DE 的相应启动器,在您的情况下是 gvfs-open 。

看着gvfs-打开手册页,此应用程序(与其他 DE 应用程序类似)仅调用按gvfs-mime设置定义的每个文件类型注册的默认应用程序。

在您的情况下, gvfs-open 尝试(但失败)找到相应的应用程序来启动firefox file.

如果您使用类似于 的 html 链接运行 xdg-open (或 gvfs-open)https://www.google.com,那么应该可以正常工作; gvfs-open将搜索mime数据库以查找如何处理html链接,mime将建议调用firefox,然后firefox将被调用。

查看 xdg-open shell 脚本函数,有一些函数Exec从相应的文件中提取条目.desktop,并且在某些桌面环境下,.desktop 文件的 Exec 部分中找到的命令只是由 xdg-open 执行。

换句话说,您不必像 Firefox 那样调用xdg-opengvfs-open启动可执行文件。

只需启动“firefox”并应执行(即popen "/usr/bin/firefox"

PS:或者你甚至可能需要打电话(exec firefox &)

您甚至可以使用 grep 循环提取所有 .desktop 文件的 Exec 条目,如下所示:

for file in $(find /usr/share/applications/ -type f -name '*.desktop'); do
    executable=$(grep -m1 "^Exec=" "$file") #some files have more than one Exec entry
    echo "$file - $executable"
done

相关内容