我正在尝试编写一个launchSystemFile
像 Windows 一样ShellExecuteEx
从命令行或从 C++ 运行的函数。
如果我ShellExecuteEx
ablah.txt
它会在默认编辑器中打开它。如果我ShellExecuteEx
afirefox.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-open
或gvfs-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