launchSystemFile
WindowsなどのShellExecuteEx
コマンドラインまたはC ++で実行される関数を作成しようとしています。
私がすると、ShellExecuteEx
メインblah.txt
エディタで開きます。私は実行可能ファイルShellExecuteEx
をfirefox.exe
起動します。
私はC ++でやっていて、popen "xdg-open blah"
実行可能ファイルを除いてうまくいきます。
xdg-open
実行を実行可能にする方法はありますか?たとえば、Firefoxのパスは/usr/lib/firefox/firefox
?
試しましたが、xdg-open "/usr/lib/firefox/firefox"
次のエラーメッセージで失敗しました。
gvfs-open: /usr/lib/firefox/firefox: オープン位置エラー: このファイルを処理するために登録されたアプリケーションはありません。
答え1
xdg-open
デスクトップ環境を検出し、そのプログラム(gnomeの場合はgvfs-open、XFCEの場合はexo-open、mate-openなど)を呼び出すために使用されるシェルスクリプトのみです。
したがって、実行可能ファイルの実行に関する制限は、各DEの対応する実行可能プログラム(あなたの場合はgvfs-open)から派生します。
見ているgvfs - マニュアルページを開く、このアプリケーション(他のDEアプリケーションと同様)は、設定gvfs-mime
で定義されているようにファイルタイプ別に登録されているデフォルトのアプリケーションのみを呼び出します。
あなたの場合、gvfs-openは起動する適切なアプリケーションを見つけようとし、失敗しますfirefox file
。
https://www.google.com
。
xdg-openシェルスクリプトの機能を見ると、そのファイルからExec
アイテムを抽出する機能があり、.desktop
一部のデスクトップ環境では、.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 entry
echo "$file - $executable"
done