
Когда я использую apt-get для случайной установки пакета, который уже установлен как зависимость другого пакета, эта «зависимость» нарушается, поскольку пакет помечается manual
как auto
.
Я смогу исправить это позже вручную, используя sudo apt-mark markauto package-name
.
Есть ли способ указать apt-get (или aptitude, dpkg или другому инструменту) не разрывать ссылку изначально или ничего не делать, если запрошенный пакет уже установлен?
Я сталкиваюсь с этим несколькими способами:
У меня есть список пакетов, которые нужно установить, чтобы что-то работало (из инструкций на таком сайте).
У меня есть список всех пакетов, которые я добавил в одну установку, и я копирую его, чтобы они все были добавлены в другую установку, например, когда я делаю чистую установку, а не обновляю свою систему.
решение1
Вы сказали
Когда я использую apt-get для случайной установки пакета, который уже установлен как зависимость другого пакета, эта «зависимость» нарушается, поскольку
manual
вместо этого пакет помечается какauto
Я думаю, вы немного ошиблись. Это не разорвет цепочку зависимостей. Другой пакет все еще зависит от этогопомечено как руководствопакет. Единственное, что затрагивается, это то, что если вы сейчас запустите apt-get autoremove
этипомечено как руководствопакеты не будут удалены. Потому что, apt
помеченные как ручные, означают, что пользователь установил их намеренно, а не потому, что пользователь хотел другие пакеты, которые в свою очередь зависели от этих пакетов.
Вы спрашивали
Есть ли способ указать apt-get (или aptitude, dpkg или другому инструменту) не разрывать ссылку изначально или ничего не делать, если запрошенный пакет уже установлен?
Я не нашел никаких инструментов, чтобы сделать это автоматически до сих пор. Но это тоже не звучит логично. Потому что в этом случае это будет похоже на то, что каждый пакет, который вы устанавливаете, будет automatically installed
, делая их уязвимыми для apt-get autoremove
команды.
Итак, если вы хотите, чтобы какой-то пакет был отмечен какавтоматически устанавливаетсянесмотря на ручную установку, необходимо использовать apt-get markauto
или aptitude mark-auto
.
решение2
Если нет возможности сделать это с помощью существующего инструмента, вот обходной путь.
Запустите каждый пакет с помощью bash-скрипта, например, следующего:
#!/bin/bash
dpkg -s "$1" &> /dev/null
(($?)) && sudo apt-get install "$1"
dpkg -s
возвращает 0, если пакет (указанный как аргумент скрипта) установлен; 1, если нет. Этот скрипт ничего не сделает, если пакет установлен, но установит его, если нет, избегая исходной проблемы.
Команда dpkg
выводит кучу информации, которая здесь не нужна, поэтому она перенаправляется в /dev/null
битовую ячейку, чтобы избавиться от нее.
(($?))
проверяет код возврата из dpkg
. Работает как C - противоположность обычным тестам bash. Если $?
равно 1, потому что пакет не установлен, это будет оценено как истинное и вызовет &&
предложение установить пакет.
В зависимости от необходимости это можно преобразовать в функцию и/или поместить в цикл по списку имен пакетов.
Если бы это использовалось часто, то также был бы добавлен код для проверки того, что аргумент, $1
, не был нулевым и не содержал встроенных пробелов или другого мусора. Но все это просто обычные скрипты, а не часть самого решения.
Я нашел dpkg
техникуздесь.