Intereting Posts

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

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