dpkg --compare-versions
Q: Wie unterscheide in Upgrades von Neuinstallationen?
A: dpkg --compare-versions "$2" lt-nl "…"
Die Debian package maintainer scripts erhalten mehrere Parameter beim Aufruf: "$1"
enthält die Aktion:
action | preinst | postinst | prerm | postrm |
---|---|---|---|---|
abort-deconfigure |
☒ | |||
abort-install |
☒ | |||
abort-remove |
☒ | |||
abort-upgrade |
☒ | ☒ | ☒ | |
configure |
☒ | |||
deconfigure |
☒ | |||
disappear |
☒ | |||
failed-upgrade |
☒ | ☒ | ||
install |
☒ | |||
purge |
☒ | |||
remove |
☒ | ☒ | ||
triggered |
☒ | |||
upgrade |
☒ | ☒ | ☒ |
Der 2. Parameter "$2"
enthält meist die Vorgänger bzw. Nachfolger-Version des Pakets. Letztere ist für Neuinstallationen leer ''
, für Upgrades aber nicht.
dpkg --compare-versions
unterstützt extra dafür die -nl
-Varianten (not less) der Vergleichsoperatoren
lt
(less-than), le
(less-equal), eq
(equal), ne
(not-equal), ge
(greater-equal), gt
(greater-than<), die den leeren-Wert bei Neuinstallationen eben anders behandeln: Normal steht die leere Version ''
immer für die kleinste Version, bei den -nl
-Varianten dagegen als die größte.
Das folgende Fragment findet man z.B. häufiger in postinst
Skripten:
case "$1" in
configure)
if dpkg –compare-versions "$2" lt-nl "$FIXED_VERSION"
then
echo "Only on upgrade"
elif dpkg –compare-versions "$2" lt "$FIXED_VERSION"
then
echo "On new or upgrade"
fi
;;
esac
Das folgende Beispiel zeigt z.B. das unterschiedliche Verhalten, wenn Paketversion 2 installiert wird und ggf. Version 1 vorher installiert war bzw. 2 (oder neuer) bereits installiert ist:
dpkg –compare-versions '' lt 2 # 0
dpkg –compare-versions '' lt-nl 2 # 1
dpkg –compare-versions '1' lt 2 # 0
dpkg –compare-versions '1' lt-nl 2 # 0
dpkg –compare-versions '2' lt 2 # 1
dpkg –compare-versions '2' lt-nl 2 # 1
PS: Bitte vermeidet test … -a …
und test … -o …
für logische Verknüpfungen, sondern verwendet [ … ] && [ … ]
bzw. [ … ] || [ … ]
, da erstere nicht wohldefiniert sind.