コマンドラインまたは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:エラーの場所を開く:このファイルを処理するアプリケーションが登録されていません
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