web-dev-qa-db-ja.com

xdg-openで実行ファイルを起動

コマンドラインまたはC++からWindows launchSystemFileのように機能する関数ShellExecuteExを記述しようとしています。

ShellExecuteEx a blah.txtの場合、デフォルトのエディターで開きます。 ShellExecuteEx a firefox.exeを実行すると、実行可能ファイルが起動します。

私はC++ popen "xdg-open blah"からやっており、実行可能ファイルを除いてそれはうまくいきます。

とにかくxdg-openに実行可能ファイルを実行させる方法はありますか?パス/usr/lib/firefox/firefoxにあるFirefoxなど

私はxdg-open "/usr/lib/firefox/firefox"を試しましたが、これはエラーメッセージで失敗します。

gvfs-open:/ usr/lib/firefox/firefox:エラーの場所を開く:このファイルを処理するアプリケーションが登録されていません

3
Noitidart

xdg-openは、デスクトップ環境を検出して対応するプログラム(gnomeの場合はgvfs-open、XFCEの場合はexo-open、mate-openなど)を呼び出す単なるシェルスクリプトです。

したがって、実行可能ファイルを起動するための制限は、各DEの対応するランチャー(ケースではgvfs-open)に由来します。

gvfs-open man page を見ると、このアプリ(他のDEアプリと同様)は、gvfs-mime設定で定義されているファイルタイプごとに登録されているデフォルトのアプリケーションを呼び出すだけです。

あなたの場合、gvfs-openはfirefox fileを起動するために対応するアプリケーションを見つけようとします(失敗します)。

https://www.google.comのようなHTMLリンクを使用してxdg-open(またはgvfs-open)を実行すると、正しく動作するはずです。 gvfs-openは、MIMEデータベースを検索してHTMLリンクの処理方法を見つけ、MIMEはfirefoxを呼び出すようにアドバイスし、firefoxが呼び出されます。

Xdg-openシェルスクリプト関数を見ると、対応する.desktopファイルからExecエントリを抽出する関数がいくつかあり、一部のデスクトップ環境では、.desktopファイルのExecセクションにあるコマンドはxdg-openによってそのまま実行されます。

つまり、Firefoxなどの実行可能ファイルを起動するためにxdg-openまたはgvfs-openを呼び出す必要はありません。

"firefox"を起動して実行する必要があります(つまりpopen "/usr/bin/firefox"

PS:または(exec firefox &)を呼び出す必要があるかもしれません

次のようなgrepループを使用して、すべての.desktopファイルでExecエントリを抽出することもできます。

for file in "$(find /usr/share/applications/ -type f -name '*.desktop')"; do
executable=$(grep -m1 "^Exec=" <<<"$file") #some files have more than one Exec entries
echo "$file - $executable"
done
3
George Vasiliou