Как программно запросить базу данных приложений Freedesktop?

Я знаю о 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 которая обеспечивает что-то очень близкое к тому, что я хочу, но я не вижу никакого способа получить доступ к этой функции напрямую через эти утилиты. Конечно, я мог бы скопировать его в свой собственный сценарий, но это явно отстой, потому что это неофициальное решение, которое нарушает конфиденциальность реализации.

One Solution collect form web for “Как программно запросить базу данных приложений Freedesktop?”

Позвольте мне предисловие к этому, сказав, что это то, что я считаю «достаточно хорошим» решением, потому что оно простое и должно работать во многих случаях, но осторожно полагаться на него на 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' ' 

Это загоняет результат поиска (путь к файлу) и пытается вырезать имя двоичного файла или команды из первой строки в файле с помощью Exec.

 which $(grep ...) > /dev/null ; echo $? 

Попытка найти результат из grep, отказаться от стандартного вывода и вывести статус выхода (0 при успехе). Это предполагает, что приложение находится в вашей PATH.

  • Кто создает документы / видео / изображения / и т. Д. в домашнем каталоге
  • Почему xdg-open использует Firefox, а не приложение по умолчанию в соответствии с xdg-mime?
  • Как изменить мою ассоциацию файлов / url на всех моих DM / WM без использования графического интерфейса?
  • Установите программу по умолчанию для типа MIME: image / *
  • Как команда xdg-open знает, какое приложение использовать для открытия файла?
  • Могу ли я добавить тип файла Twig в Linux?
  • Как заставить службу /etc/xdg/autostart/app.desktop ждать службы (systemd)?
  • Как проверить / проверить файлы .desktop?
  • Файлы рабочего стола XDG / меню и XFCE
  • Firefox пытается открыть TeX-файлы с помощью новинок
  • Почему dconf отличается от dconf-редактора?
  • Interesting Posts

    Сделал беспорядок в конце файла limits.conf, будет ли он работать?

    почему нам здесь не нужен экспорт?

    Использование sed для извлечения текста между двумя тегами

    grub ждет ввода пользователем при загрузке в качестве гостевого в виртуальном боксе

    Как удалить файл лицензии, когда debian-упаковка с использованием автозапуска automake?

    Как ограничить входящую и исходящую полосу пропускания на конкретный хост на CentOS и с него

    Как использовать `find -exec` для выполнения команды в каталоге найденного файла (не текущей директории)?

    Команда ssh в фоновом режиме

    Проблемы с Arch Linux

    Как скопировать папку рекурсивно идемпотентным способом с помощью cp?

    Синтаксис строки для макроса kbd в Emacs

    uboot написать ядро ​​в mmc раздел

    Файловая система для обмена дисками между Linux и FreeBSD

    размер блока файла – разница между stat и ls

    материал в кавычках скрыт в сообщении об ошибке компиляции для gcc?

    Linux и Unix - лучшая ОС в мире.