デスクトップ項目の個々のフィールドをオーバーライドします。

デスクトップ項目の個々のフィールドをオーバーライドします。

私はデスクトップ環境としてLXDEを使用してDebianシステムを設定しています(実際にはラズベリーパイオペレーティングシステムビデオ)。

付属のアプリケーションがあります。.desktop文書。クール!

残念ながら、MyApplication.desktopファイルにはメニューにアイコンが表示されないようにする次の行が含まれています。

NoDisplay=true

それでは、別のフィールドに触れることなく、システムファイル全体でこの単一のフィールドをオーバーライドする一般的な方法を見つけたいと思います。MyApplication.desktopこれをオーバーライドだと思います。

特に、頑張って避けるこのような回避策は...

sed -e 's/^NoDisplay=true/NoDisplay=false/' /usr/share/applications/MyApplication.desktop \
    > /usr/local/share/applications/MyApplication.desktop

...これは、ファイルの最新のアップストリームバージョンで導入された変更が失われるためです(システムから削除したMyApplication.desktop後もメニュー項目をそのまま残すことができます)。MyApplication

明らかに、標準は部分的な.desktopファイルだけを許可しません。たとえば、次は機能しません。

$ cat /usr/share/applications/MyApplication.desktop
[Desktop Entry]
Name=My Cool Application
GenericName=My Application
Exec=myapp %f
Icon=myapp
Type=Application
Terminal=false
Categories=Application
NoDisplay=true

$ cat /usr/local/share/applications/MyApplication.desktop
[Desktop Entry]
NoDisplay=false

include同様に、次のメカニズムもありません。

$ cat /usr/local/share/applications/MyApplication.desktop
include=/usr/share/applications/MyApplication.desktop
[Desktop Entry]
NoDisplay=false

これを達成するための私のオプションは何ですか?

答え1

.desktopファイルの新しいバージョンについてはあまり心配しません。ほとんど変更されません(変更した場合、通常、変更は非常にマイナーであり、必要に応じて手動で簡単に編集できます...または変更と一緒に使用してマージできdiffます)。patch

これが心配な場合は、.desktopファイルの編集されたコピーを/usr/local/share/applications/返品元のファイルをバックアップします(例:から/usr/share/applications/file.desktop/usr/share/applications/file.desktop.orig

その後、夜または毎週cronジョブを実行して比較し、結果をメールで受け取ることができます(または覚えているときに確認できるようにファイルに書き込むことができます:-)。

cron-jobスクリプトは、次の基本から始まります。

for f in /usr/share/applications/*.desktop.orig; do
  bn="$(basename "$f" ".orig")
  diff -u "$f" "$bn"
done

/usr/share/applications.backup/または、セクションに ".orig"を追加して同じ名前に変更したいコピーを作成するdiff代わりに、パイピングを介して欠落しているファイルに関する警告をミュートすることもできます。-rgrep -v

diff -u -r /usr/share/applications.backup/ /usr/share/applications/ |
  grep -v '^Only in /usr/share/applications/`

別のオプションは、git init/usr/share/applicationsで実行し(ディレクトリがルート所有であるため、ルートとして実行する必要があります)、そこにあるすべての.desktopファイルをコミットし、新しいファイルが追加されたときにコミットすることを覚えておくことです。git statusその後、git diffなどのgitサブコマンドを使用して、git show違いやコミットされていない変更、新しいファイル、または削除されたファイルを表示できます。

gitはこれらの設定ファイルを管理するための優れたツールであり、単にソースコードプログラミングのためのものではありません。これマネージャーをお待ちくださいたとえば、プログラムはgitを使用してすべての改訂履歴を/ etcに保存します(アップグレードの前後に変更を自動的にコミットするためのapt、yum、dnfなどのフックを含む)。まだインストールしていない場合はインストールする価値があります。 。

答え2

パッケージがアップグレードされると、デスクトップエントリ(.desktop)ファイルが/usr/share/applications上書きされます。変更を失うことなくファイルを上書きするには、コピーを保存して~/.local/share/applications変更します。


変更が検出されると、元のデスクトップファイルをオプションで自動的に上書きするように更新されました。

目的:デスクトップファイルの変更を監視し、スクリプトを実行して必要な変更を実装します。

  1. /usr/local/bin/update-myapp-desktop-file.shデスクトップファイルを必要に応じて変更するスクリプトを作成します。
#!/usr/bin/env bash

sed -i 's/^NoDisplay=true/NoDisplay=false/' /usr/share/applications/MyApplication.desktop

スクリプトを実行可能としてマークします。chmod 755 /usr/local/bin/update-myapp-desktop-file.sh

  1. /etc/systemd/system/myapp-desktop-file.serviceスクリプトを実行するためのsystemdサービスファイルを作成します。
[Unit] 
Description=Update MyApp desktop file

[Service]
ExecStart=/usr/local/bin/update-myapp-desktop-file.sh
  1. /etc/systemd/system/myapp-desktop-file.pathデスクトップファイルの変更を監視するには、対応するシステムパスファイルを作成します。
[Unit]
Description=Monitor for changes to MyApp desktop file

[Path]
PathModified=/usr/share/applications/MyApplication.desktop
Unit=myapp-desktop-file.service

[Install]
WantedBy=multi-user.target
  1. systemdパスファイルを確認、有効化、および起動します。
systemd-analyze verify /etc/systemd/system/myapp-desktop-file.*
systemctl enable myapp-desktop-file.path
systemctl start myapp-desktop-file.path

関連情報