我正在设置一个 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 文件的新版本 - 它们很少更改(当它们更改时,更改通常非常小,并且如果需要的话可以轻松手动编辑......或使用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
或者,不要将要更改为相同名称并附加“.orig”的文件复制到,例如,/usr/share/applications.backup/
.然后,您diff
只需一个递归-r
diff 命令就可以将它们全部包含在内(并且因为备份目录只是原始目录的一小部分,所以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 status
、git diff
和 )git show
来显示任何差异或未提交的更改或新文件或已删除文件。
git
是管理此类配置文件的好工具,它不仅仅是用于编程源代码。这等等管理员例如,程序使用 git 来保存 /etc 中所有内容的修订历史记录(带有 apt、yum、dnf 等的挂钩,以便在升级前后自动提交更改)——如果您还没有安装,那么绝对值得安装。
答案2
软件包升级时,桌面条目 (.desktop) 文件/usr/share/applications
将被覆盖。要覆盖文件而不丢失更改,请放置一个副本~/.local/share/applications
并在此处进行更改。
更新为在检测到更改时选择性地自动覆盖原始桌面文件
目标:监视桌面文件的更改并执行脚本以实现所需的更改。
- 创建脚本
/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
- 创建 systemd 服务文件
/etc/systemd/system/myapp-desktop-file.service
来运行脚本:
[Unit]
Description=Update MyApp desktop file
[Service]
ExecStart=/usr/local/bin/update-myapp-desktop-file.sh
- 创建相应的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
- 验证、启用并启动 systemd 路径文件:
systemd-analyze verify /etc/systemd/system/myapp-desktop-file.*
systemctl enable myapp-desktop-file.path
systemctl start myapp-desktop-file.path