Установите зависимости с помощью apt-get, не делая их независимыми, если они уже установлены

Установите зависимости с помощью apt-get, не делая их независимыми, если они уже установлены

Когда я использую 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техникуздесь.

Связанный контент