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-*
ユーティリティは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 $?
上記の出力がゼロの場合、アプリケーションが存在することを意味します。
それを破壊する:
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にあると仮定します。