Como consultar programaticamente o banco de dados do aplicativo Freedesktop?

1

Eu sei sobre xdg-mime , que pode consultar o mapeamento do tipo de arquivo MIME para o aplicativo de área de trabalho associado. Mas isso pode retornar mapeamentos para aplicativos inexistentes, por exemplo,

$ xdg-mime default non-existent.desktop x-scheme-handler/http             
$ xdg-mime query default x-scheme-handler/http                  
non-existent.desktop

Como posso determinar programaticamente se um determinado aplicativo de desktop é válido, ou seja, instalado? Eu estou supondo que isso exigiria a pesquisa de ambos $XDG_DATA_HOME e os caminhos em $XDG_DATA_DIRS , mas parece que deve haver algum tipo de utilitário para consultar esse banco de dados do aplicativo, em vez de ter que fazê-lo manualmente.

AFAICS, muitos dos utilitários xdg-* são scripts de shell contendo uma função desktop_file_to_binary que fornece algo muito próximo do que eu quero, mas não consigo ver nenhuma maneira de acessar essa função diretamente por meio desses utilitários. Claro, eu poderia copiá-lo em meu próprio script, mas isso obviamente é uma droga, porque é uma solução não oficial que viola a privacidade da implementação.

    
por Adam Spiers 23.08.2016 / 19:52

1 resposta

0

Deixe-me começar dizendo que isso é o que eu considero uma solução "boa o suficiente" porque é simples e deve funcionar em muitos casos, mas tenha cuidado em confiar 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 $?

Se as saídas acima forem 0, então a aplicação existe.

Quebrando:

locate --existing --limit 1 $(xdg-mime query default x-scheme-handler/http)

Localiza o primeiro arquivo correspondente ao nome retornado por xdg-mime. O comando locate deve funcionar para isso na maior parte do tempo, pois, na minha experiência, a maioria dos XDG_DATA_DIRS dos sistemas está localizada em / usr / share / usr / local, que geralmente é incluída no banco de dados usado pelo comando locate. No entanto, há casos especiais em que isso pode não ser verdade e / ou deve haver algum pedido para qual arquivo da área de trabalho é lido primeiro e usado (talvez algum arquivo específico do usuário). Então, tecnicamente, isso pode não ser "adequado", mas é simples e mais fácil do que analisar $ XDG_DATA_DIRS e $ XDG_DATA_HOME

grep -m 1 Exec $(locate ...) | cut -f2 -d'=' | cut -f1 -d' '

Isto acelera o resultado de locate (um caminho de arquivo) e tenta recortar o nome do binário ou comando da primeira linha no arquivo com Exec.

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

Tenta localizar o resultado do grep, descartar a saída padrão e gerar o status de saída (0 em sucesso). Isso pressupõe que o aplicativo esteja no seu PATH.

    
por 24.08.2016 / 06:54