覆盖桌面条目中的单个字段

覆盖桌面条目中的单个字段

我正在设置一个 Debian 系统,以 LXDE 作为桌面环境(实际上,我只是重新制作一个树莓派操作系统图像)。

我有一个附带的应用程序.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 文件的新版本 - 它们很少更改(当它们更改时,更改通常非常小,并且如果需要的话可以轻松手动编辑......或使用diffpatch合并任何更改)。

如果您担心这一点,那么每当您将 .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

或者,不要将要更改为相同名称并附加“.orig”的文件复制到,例如,/usr/share/applications.backup/.然后,您diff只需一个递归-rdiff 命令就可以将它们全部包含在内(并且因为备份目录只是原始目录的一小部分,所以grep -v可以通过管道来消除有关丢失文件的警告):

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

另一种选择是git init在 /usr/share/applications 中运行(需要以 root 身份运行,因为该目录由 root 拥有)并提交其中的所有 .desktop 文件,并记住在添加新文件时提交它们。然后,您可以使用 git 子命令(如git statusgit diff和 )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. 创建 systemd 服务文件/etc/systemd/system/myapp-desktop-file.service来运行脚本:
[Unit] 
Description=Update MyApp desktop file

[Service]
ExecStart=/usr/local/bin/update-myapp-desktop-file.sh
  1. 创建相应的systemd路径文件/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

相关内容