理由1:最も単純な相対パスバージョンは既存の標準と競合しています。

理由1:最も単純な相対パスバージョンは既存の標準と競合しています。

これ.desktop ファイルGUIで実行可能ファイルを簡単に起動できず、多くの実行可能プログラムはアプリケーションアイコンを使用せずに.desktopファイルで指定されたアイコンのみを使用するため、Linuxデスクトップからアプリケーションに簡単にアクセスするための事実上の標準になりました。

それでは、実行可能ファイルの相対パスを指定する.desktopファイルを使用することが不可能に見えるのはなぜですか?この問題を解決する方法はありますか?

ユーザーに強制的にインストールしたくないソフトウェアを公開するときにこれを達成する唯一の方法は相対パスです。

AppImageは、ユーザーが初めて実行したときに.desktopファイルをインストールしてこの問題を解決するようです。これは、柔軟なパスを持つソフトウェアのアイコンと、ランチャーをアクティブにするための恥ずかしい方法のようです。相対パスはより良いアプローチです。 Linuxデスクトップでこのソリューションが利用できないのはなぜですか?これが単純な間違いのようには思えませんが、この決定の後に隠れたより深い理由を見落としていたようです。

答え1

インラインシェルスクリプトを使用してパスを計算できます。

Exec=sh -e -c "exec \\"\\$(dirname \\"\\$0\\")/some_app\\"" %k

はい、2つのレベルのエスケープが必要です。

答え2

FreeDesktopの標準は単なる標準であることを覚えておいてください。原則として、KDE、GNOME、LXDE、XFCEなどのベンダーは、標準プロセスを経ることなく相対パスのサポートを追加できますが、実際にはどのベンダーもそうではありませんでした。 (GNOME 3.28.2とKDE Plasma 5.12.9はどちらも相対パスをサポートしていないと確信しています。

なぜこれですか?

理由1:最も単純な相対パスバージョンは既存の標準と競合しています。

次のデスクトップファイルを考えてみましょう。

[Desktop Entry]
Type=Application
Name=My example app
Exec=my_example_app
Icon=example-app

これFreeDesktopの仕様によると:

標準ボタン

Icon

ファイルマネージャ、メニューなどに表示されるアイコン名が絶対パスの場合、そのファイルが使用されます。名前が絶対パスではない場合に説明されているアルゴリズムは、アイコンテーマ仕様アイコンを配置するために使用されます。

[。 。 。 ]

型の値はiconstringアイコンの名前です。これは絶対パス、またはで説明されているアルゴリズムを使用して見つかったアイコンの記号名です。アイコンテーマ仕様。これらの値はユーザーが表示できず、UTF-8でエンコードされます。

絶対パスではないため、example-appアイコンを表示したいメニューとパネルは、アイコンのテーマの仕様に応じて、一般的に同様のフォルダを見つけて正しいパスを見つけます。

/usr/share/icons/hicolor/48x48/apps/example-app.png

しかし、example-app相対パスも有効なので、アイコン文字列があいまいになりました。あるデスクトップ環境では相対パスを使用し、もう一方のデスクトップ環境では相対パスを使用しないと互換性が失われます。

もう一度Execコアを考えてみましょう。

Exec=my_example_app

仕様によると、フルパス(つまり絶対パス)または実行可能ファイルでなければなりません$PATH

キーExecにはコマンドラインを含める必要があります。コマンドラインは実行可能プログラム(オプションで1つ以上の引数が続きます)で構成されています。実行プログラムはフルパスまたは実行可能ファイル名のみを使用して指定できます。フルパスが指定されていない場合は、$PATHデスクトップ環境で使用される環境変数で実行可能ファイルを見つけます。

https://specations.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables

したがってmy_example_app、を見てみる必要がありますが、相対パスだと思ったら、存在しないどこかを$PATH調べる必要があります。$PATHどちらが優先ですか?

今、おそらく、すべての相対パスにプレフィックスを付けるように要求することができます。 それらを明確にするために./。これはファイル名には許可されていないため、/あいまいではありません。たとえば、次のようになります。

Icon=./example-app.png
Exec=./my_example_app

同じ作業ディレクトリにあるファイルの場合、または

Icon=./../example-app.png
Exec=./../my_example_app

親ディレクトリにあるファイルの場合。

これは別の質問を提起します。作業ディレクトリと見なされるものは何ですか?

理由2:デスクトップファイルの予想される作業ディレクトリが明確ではない可能性があります。

デスクトップファイルは、次のキーを使用して作業ディレクトリを設定できますPath

Path

項目タイプがApplication実行されているプログラムの作業ディレクトリ。

したがって、デスクトップファイルに有効なPathキーがあり、次の相対パスを指定したい場合:

Path=/home/username/path/to/myfolder/
Exec=./my_example_app

デスクトップファイルの場所に相対的ですか、それともキーに相対的ですかPath

考慮すべき他の可能性があります。

  • パスは相対的でなければなりませんか$XDG_DATA_HOME

    これは、実際のデスクトップファイルとアイコンが保存される場所ですが、実行可能ファイルが保存される場所ではないため、ある程度意味があります。

  • パスはランチャープロセスの作業ディレクトリに相対的でなければなりませんか?

    パネルやメニューを表示するプロセスは、実行可能ファイルとアイコンがどこにあるかを知る必要があるため、これは意味があります。通常、ウィンドウマネージャの作業ディレクトリはユーザーのホームディレクトリですが、原則として作業ディレクトリはどこにでも存在できます。

理由3:デスクトップファイルを移動する場合は、相対パスを更新する必要があります。

Path[OK]、実行可能ファイルとアイコンのパスが常にデスクトップファイルに相対的であり、キー、実行プログラムプロセスなどを無視することを指定しているとします。

それでは、そのデスクトップファイルを別の場所にコピーしたいとしましょう。たとえば、次のようになります。

~/Desktop/example-app.desktop

相対パスが異なるため、デスクトップファイルを編集してパスを変更し直す必要があります。絶対パスまたは標準フォルダの場所を使用すると、この問題を解決できます。

理由4:メニューとパネルを使用するには、デスクトップファイルがどこにある必要があります。

相対パスは、デスクトップファイルを同じディレクトリに保存し、ファイルマネージャを使用して実行する限り機能します。しかし、メニューやパネルランチャーでデスクトップファイルを実行したいとしましょう。デスクトップファイルは次の場所にあります。

/usr/share/applications/

それとも中にいるかもしれません。

~/.local/share/applications/

または

~/.config/xfce4/panel/

アイコンまたは実行可能ファイルの相対パスはどちらとも同じではありません。さらに、それは次のように変わります$XDG_DATA_HOME そして$XDG_DATA_DIRS、デスクトップファイルはまったく異なる場所にあります。

元の質問で言及されたユースケースは、GUIで実行可能ファイルを実行し、インストールせずにカスタムアイコンを表示することでした。

それ以外の場合、実行可能ファイルはGUIで簡単に起動されず、多くの実行可能プログラムはアプリケーションアイコンを使用せず、.desktopファイルで指定されたアイコンのみを使用します。

それでは、実行可能ファイルの相対パスを指定する.desktopファイルを使用することが不可能に見えるのはなぜですか?この問題を解決する方法はありますか?

ユーザーに強制的にインストールしたくないソフトウェアを公開するときにこれを達成する唯一の方法は相対パスです。

私たちが最初にソフトウェアの標準インストール手順を面倒にする理由の1つは、他のプロセスがリソースを見つけることができるようにリソースを標準の場所に配置することです。これにより、インストールとアンインストールがより複雑になりますが、確認するディレクトリが少なく、キャッシュやデバッグなどの作業に役立ちます。

実行可能ファイルをインストールしたくない場合は、相対パスで実行できますが、他のプロセス(メニューランチャーやパネルなど)を介して便利に実行するには、他のプロセスでこれを知る必要があります。見てください。各プロセスには独自の作業ディレクトリがあるため、相対パスが異なる場合があります。

これ仕様には言葉があります。:

したがって、アプリケーションの作成者であり、KDEおよびGnomeメニューで動作するようにアプリケーションアイコンをインストールしようとします。少なくともhicolorテーマには48x48アイコンをインストールする必要があります。これは、$prefix/share/icons/hicolor/48x48/appsにPNGファイルをインストールすることを意味します。さまざまなサイズのアイコンをインストールすることを選択できます。たとえば、$prefix/share/icons/hicolor/scalable/appsにsvgアイコンをインストールすると、ほとんどのデスクトップにすべてのサイズのアイコンがあることを意味します。

したがって、ここにアイコンをインストールできます。

~/.local/share/icons/hicolor/48x48/apps/example-app.png

またはここ:

~/.local/share/icons/hicolor/scalable/apps/example-app.svg

iconstring次に、単に次のように引用してくださいexample-app

Icon=example-app

そして、ランチャープロセスはアイコンを見つけることができます。

これは実際には相対パスではありませんが、絶対パスを使用する必要がある問題を解決し、デスクトップファイルを別の場所に移動しても中断されません。

アイコンフォルダのイメージではなくExec実行可能ファイルであることを除いて、キーにも同様に適用されます。$PATH

結論:前の議論とリンク。

アイコンの相対パスのサポートは、少なくとも2008年9月上旬にFreeDesktopメーリングリストで議論されました。

Magnus Bergmark gmail.comのmagnus.bergmark

2008年9月23日火曜日01:01:32 PDT

[。 。 。 ]

どういうわけか相対パスを使用できるようにすることをお勧めします。

はい

  1. 私は複数の.directoryファイルを使用して映画ポスターをアイコンとして使用して、映画を含むディレクトリを作成します。この動作は、漫画本、音楽(アルバムアート)、写真など、あらゆる種類のメディアに適用できます。

  2. ベンダーはデスクトップメニューに表示されないため、アプリケーションディレクトリに残っている.desktopファイルで使用するために展開しているソフトウェアにアイコンを囲むことができます。

https://lists.freedesktop.org/archives/xdg/2008-September/009940.html

この提案について私が見つけることができる唯一の反論は次のとおりです。

標準アプリケーションディレクトリに入らない.desktopファイルはほとんど役に立ちません。たぶん、いくつかのパッケージ提案と実装を見て使用する必要があります。別のオプションは、適切な場所に.desktopファイルとアイコンをインストールするxdg utilsスクリプトです。あなたが削除したアプリもアイコンのテーマとアイコンの命名規則に従わないように意図されていると仮定できます。そして、私はディレクトリにアイコンを設定することは本当に便利だとは思わない。 elfバイナリにはwin32バイナリと同じリソースはありませんが、実際の実行可能ファイルのアイコンを設定すると便利です。

https://lists.freedesktop.org/archives/xdg/2008-September/009962.html

関連質問:

関連リンク:

答え3

私の.homeディレクトリへの相対パスが必要ですfirefox.desktop。これにより、各ユーザーは独自のFirefoxプロファイルを起動できますfirefox-frank~/Documents/.../home/frank/Documents/...

有効な実行行は次のとおりです。(上記の@timothy-baldwinの答えに感謝します)

Exec=sh -e -c "/usr/bin/firefox -profile \"/home/$(whoami)/Documents/chrome-profiles/firefox-$(whoami)\""

答え4

この状況を理解するには、「何と関係がありますか?」と助言してください。これらの.desktopファイルはGUIコンテキストで使用され、デフォルトのパスが.desktopファイルに入れることを考慮できる相対パスから絶対パスを構築できるとは考えられません。

相対パスは、明示的な位置(絶対パス)に変換でき、参照点が必要な場合にのみ便利です。これは一般的なGUIコンテキストでは想定できません。

関連情報