프로그래밍 방식으로 Freedesktop 애플리케이션 데이터베이스를 쿼리하는 방법은 무엇입니까?

프로그래밍 방식으로 Freedesktop 애플리케이션 데이터베이스를 쿼리하는 방법은 무엇입니까?

xdg-mimeMIME 파일 형식에서 관련 데스크톱 응용 프로그램으로의 매핑을 쿼리할 수 있는 방법이 무엇인지 알고 있습니다 . 그러나 이는 존재하지 않는 애플리케이션에 대한 매핑을 반환할 수 있습니다.

$ 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-*유틸리티는 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에서 반환된 이름과 일치하는 첫 번째 파일을 찾습니다. 내 경험에 따르면 대부분의 시스템에는 XDG_DATA_DIRS가 /usr/share /usr/local에 있으며 이는 일반적으로 찾기 명령에 사용되는 데이터베이스에 포함되어 있습니다. 그러나 일부 특별한 경우에는 이것이 사실이 아닐 수도 있고/또는 데스크톱 파일(아마도 일부 사용자별 파일)을 먼저 읽고 사용하는 순서가 있어야 합니다. 따라서 기술적으로 이는 "정확"하지 않을 수 있지만 $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에 있다고 가정합니다.

관련 정보