Мой пример выхода в один лайнер:
COMAND || ( echo "ERROR – executing COMAND, exiting..." ; exit 77 );[ "$?" -eq 77 ] && exit
Я боролся с той же ситуацией и нашел решение, которое сработало для меня.
В моем случае мне нужно переключаться между версиямиpsql-dev
(postgresql ),поэтому сначала я должен добавить репозиторий postgresql apt и каждый из выпусков, доступных для установки для моего дистрибутива:
cat /etc/apt/sources.list.d/pgdg.list
deb http://apt.postgresql.org/pub/repos/apt xenial-pgdg 9.4 9.5 9.6 10 11
Только с этим вы не сможете перейти с версии 11*
на 9.6*
из-за возникшей ошибки. Трюк объясняется в этой статье:
cat /etc/apt/preferences.d/xenial-pgdg.pref
Explanation: postgresql: xenial-pgdg
Package: *
Pin: release c=9.6
Pin-Priority: 1001
После закрепления выпуска с приоритетом 1001
или выше будут установлены зависимости из этого выпуска, в данном случае все зависимости, соответствующие версии 9.6*
.
При понижении версии зависимостей система apt
должна знать, до какой версии следует понизить каждую зависимость.
На практике часто требуется понизить версию пакета вместе с его зависимостями до заданного выпуска с помощью параметра -t
.Таким образом, вы будете использоватьsudo apt-get -t=<target release> install <package-name>
Но есть одна загвоздка. :Выпуск должен быть настроен так, чтобы разрешать переход на более раннюю версию. Это означает, что его предпочтение должно быть больше, чем 1000
, иначе apt сохранит текущую установленную версию. Подробнее см. https://linux-tips.com/t/downgrade-a-package-with-its-dependencies/261
apt
отказывается понижать версии пакетов, которые вы уже установили, если вы не попросите сделать это явно.
Один из способов сделать это, как вы выяснили, — указать каждую версию вручную в команде install
. Если вы хотите убедиться, что зависимости будут удалены при удалении pigpio
, вы можете пометить их как auto
с помощью apt-mark
после установки.
Более простой способ — сначала удалить эти обновленные пакеты :
.apt-get remove pigpio
apt-get autoremove
apt-get install pigpio=1.68-3+rpi1
Обычно это должно работать, но по какой-то причине это не работает для pigpio
, возможно потому, что в выпуске по умолчанию есть только один пакет. Что работает с pigpio
, так это опция -t release
,а узнать к какому релизу относится пакет можно с помощью apt-cache
илиapt policy
:
pi@raspberrypi:~ $ apt-cache madison pigpio
pigpio | 1.78-1+rpi1 | http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages
pigpio | 1.68-3+rpi1 | http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
pi@raspberrypi:~ $ apt policy pigpio
pigpio:
Installed: (none)
Candidate: 1.78-1+rpi1
Version table:
1.78-1+rpi1 500
500 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages
1.68-3+rpi1 500
500 http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
pi@raspberrypi:~ $ sudo apt-get -t buster install pigpio
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
libpigpio-dev libpigpio1 libpigpiod-if-dev libpigpiod-if1 libpigpiod-if2-1 pigpio-tools pigpiod
The following NEW packages will be installed:
libpigpio-dev libpigpio1 libpigpiod-if-dev libpigpiod-if1 libpigpiod-if2-1 pigpio pigpio-tools pigpiod
0 upgraded, 8 newly installed, 0 to remove and 7 not upgraded.
Need to get 328 kB of archives.
After this operation, 990 kB of additional disk space will be used.
Если autoremove
не удаляет все зависимости, это означает, что что-то еще в вашей системе зависит от этих пакетов. Вам нужно будет либо удалить это что-то, либо понизить его версию вместе с pigpio
. Обратите внимание, что указание старых версий пакетов вручную в этом случае также не сработает.