有没有办法在升级系统之后对特定的包执行特定的脚本?

比如说我用风滚草,运行zypper dup之后可能更新几百个包,其中有一些包我想做一些特别的设置,比如升级 xkeyboard-config 之后我想运行一下我 home 目录下面的一些脚本,有没有办法做到?

Arch 的话似乎有 Pacman Hook 可以做到类似的事情,但是 openSUSE 的话有办法吗?

有,%post 字段就是干这个的。

那他就要把脚本打个包了吧
写一个总的脚本里判断下 VERSION_ID 决定是否执行会不会好点?然后扔.bashrc 里

@hillwood
您可能没理解我的意思。%post 字段是把安装后的脚本写在 RPM 包里面,而我这里说的情况是把脚本只保存在本地,不在 RPM 包里面。
把脚本放在本地而不是自行打包进 RPM 的好处:

  1. 不需要自行 fork 上游的包后自己往%post 里面添加东西,避免自行打包的维护负担和未来潜在的冲突风险
  2. 自行打包会把 rpm 发布在 home:车库里面,可能有时候访问 home:会比较慢,没有访问官方源或者镜像源快。

不修改 rpm 无法办到。不过可以利用 systemd timer 设置一个计划任务定时检测对应的包,一旦有修改就执行对用的脚本。实时办不到。

@hillwood Arch Linux 上有 pacman hooks 可以实现这个功能:https://man.archlinux.org/man/alpm-hooks.5

能办到吧,在 %post 里检测两点

  1. openSUSE 版本,可以用 0%{?suse_version}
  2. /home 里脚本的存在性,比如 if [ -e /home/xxx.sh ];

然后这里面就可以运行脚本了啊。不一定非要在包里啊,你运行 update-alternative 或者 gtk-icon-cache-update 什么的也没得非打包起来啊

@marguerite
但是如果包是上游的(比如 openSUSE:Factory 里面的包),我也没办法随便改人家的%post 呀

如果不一定在包里面的话,如何才能做到升级包的时候自动执行指定脚本(假定我没有办法可以修改上游包的%post,也不考虑 fork 一个到 home:)?

他的意思是不动上游的 spec。

可以,你自己打一个包,随着系统升级更新就行,dup 之前给 obs 推个版本 +0.1 的包,然后带着 home 源更新就行了,空包也不会很大

那可以写个 zypp-plugin。yum 和 dnf 有类似的:

zypp-plugin 的文档:

zypper 支持多种类型的 plugin…我感觉你可以看看那个 appdata refresh plugin 找找灵感