我知道xdg-mime
哪个可以查询从 MIME 文件类型到关联桌面应用程序的映射。但这可能会返回到不存在的应用程序的映射,例如
$ xdg-mime default non-existent.desktop x-scheme-handler/http
$ xdg-mime query default x-scheme-handler/http
non-existent.desktop
如何以编程方式确定给定的桌面应用程序是否有效(即已安装)?我猜测这需要搜索$XDG_DATA_HOME
和 中的路径$XDG_DATA_DIRS
,但似乎应该有某种实用程序来查询此应用程序数据库,而不必手动执行。
AFAICS,许多xdg-*
实用程序都是 shell 脚本,其中包含一个函数desktop_file_to_binary
,该函数提供的功能非常接近我想要的功能,但我看不到任何通过这些实用程序直接访问该函数的方法。当然,我可以将其复制到我自己的脚本中,但这显然很糟糕,因为这是一个非官方的解决方案,侵犯了实现的隐私。
答案1
首先我要说的是,这是我认为“足够好”的解决方案,因为它很简单,并且应该在很多情况下都有效,但请谨慎 100% 依赖它。
which $(grep -m 1 Exec $(locate --existing --limit 1 $(xdg-mime query default x-scheme-handler/http)) | cut -f2 -d'=' | cut -f1 -d' ') > /dev/null ; echo $?
如果上面的输出为 0,则表明该应用程序存在。
分解一下:
locate --existing --limit 1 $(xdg-mime query default x-scheme-handler/http)
找到与 xdg-mime 返回的名称匹配的第一个文件。根据我的经验,locate 命令应该在大多数情况下都有效,大多数系统的 XDG_DATA_DIRS 位于 /usr/share /usr/local 中,它通常包含在locate 命令使用的数据库中。但是,在某些特殊情况下,这可能不是真的和/或应该有一些顺序,首先读取和使用桌面文件(可能是某些用户特定的文件)。因此从技术上讲,这可能不“正确”,但它比解析 $XDG_DATA_DIRS 和 $XDG_DATA_HOME 更简单
grep -m 1 Exec $(locate ...) | cut -f2 -d'=' | cut -f1 -d' '
这会 grep 定位(文件路径)的结果,并尝试使用 Exec 从文件的第一行中删除二进制文件或命令的名称。
which $(grep ...) > /dev/null ; echo $?
尝试从 grep 中查找结果,丢弃标准输出并输出退出状态(成功时为 0)。这假设应用程序位于您的 PATH 中。