Существует ли различие между загрузкой / установка списка пакетов и загрузкой каждого packge его собственным?

Учитывая список dev пакетов (например, pkgs = "python3.5-dev python3-tk"), там было бы различие между выполнением

sudo apt-get install $pkgs 

по сравнению с.

for p in $pkgs; do sudo apt-get install $p; done

Я спрашиваю главным образом dependencies-topo-sort связанный, т.е. там буду различными пакетами, загруженными и установленными в так или иначе

10
задан 1 December 2019 в 15:17

2 ответа

Да, различные пакеты могут быть выбраны для удовлетворения зависимостей. При выполнении 1 команды, которая указывает, пакеты N, которые будут установлены, будут иногда иметь другой эффект от выполнения N, управляет, каждый из которых указывает 1 пакет, который будет установлен, даже когда фактические указанные пакеты являются тем же в каждом случае.

Основным практическим различием является, вероятно, один karel, описал. Однако эффекты могут отличаться, даже когда все операции успешно выполняются, из-за другого разрешения зависимости.

Причина состоит в том, когда Вы широко предположили:

Я спрашиваю главным образом dependencies-topo-sort связанный

Строго говоря, это происходит, потому что может быть больше чем одна альтернатива, которая удовлетворяет зависимость.

Абстрактное объяснение

Предположим, что Вы хотите установить пакет a, который зависит от виртуального пакета v, и v может быть удовлетворен пакетом b или пакет c и никаким другим способом. Предположим b не зависит от c, c не зависит от b, и ни один из тех пакетов уже не установлен. Теперь предположите, что Вы работаете:

sudo apt-get install a

Затем APT выберет b или c удовлетворить зависимость. Какой, который это выбирает, является результатом вычисления, которое это выполняет, который может быть затронут, какими пакетами Вы установили, какие пакеты доступны, какую версию APT Вы используете, и как это настроено. Но когда все эти условия являются тем же, решение будет принято тот же каждый раз.

Предположим без потери общности, что она выбирает b. Затем a и b установлены. Предположим, что Вы затем работаете:

sudo apt-get install c

После этого, a, b, и c все установлены. Таким образом, все три пакета были установлены в результате выполнения:

sudo apt-get install a
sudo apt-get install c

Напротив, предположите, что необходимо было выполнить эту команду вместо тех:

sudo apt-get install a c

Затем с тех пор aзависимость от v удовлетворен c, b не установлен. Таким образом, только a и c, но нет b, установлены в результате выполнения:

sudo apt-get install a c

Конкретный пример

Можно найти конкретные примеры этого путем выполнения apt или apt-get с -s опция, которая заставляет это моделировать Ваше действие вместо того, чтобы выполнить его. (Просто помните, что Вы не можете полностью подтвердить их только с apt-get -s/apt -s, потому что ранее apt-get -s/apt -s команды не влияют на более поздние, так как они ни на что не влияют, так как они - только моделирования.)

Выполнение sudo apt-get install jedit на моей Ubuntu 16.04 система LTS установила бы несколько пакетов OpenJDK 8:

ek@Io:~$ apt -s install jedit
NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  ca-certificates-java default-jre default-jre-headless java-common java-wrappers openjdk-8-jre openjdk-8-jre-headless
Suggested packages:
  default-java-plugin icedtea-8-plugin fonts-wqy-zenhei fonts-indic
The following NEW packages will be installed:
  ca-certificates-java default-jre default-jre-headless java-common java-wrappers jedit openjdk-8-jre
  openjdk-8-jre-headless
0 upgraded, 8 newly installed, 0 to remove and 11 not upgraded.
Inst java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Inst ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all]) []
Inst java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all]) []
Inst openjdk-8-jre-headless (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Inst default-jre-headless (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Inst openjdk-8-jre (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Inst default-jre (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Inst jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Conf java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Conf java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all])
Conf ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all])
Conf openjdk-8-jre-headless (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Conf default-jre-headless (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Conf openjdk-8-jre (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Conf default-jre (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Conf jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])

Если я сказал APT устанавливать обоих jedit и openjdk-9-jre путем выполнения sudo apt-get install jedit openjdk-9-jre, затем это не установило бы пакеты OpenJDK 8, потому что jeditзависимость от Среды выполнения Java удовлетворена пакетами OpenJDK 9:

ek@Io:~$ apt -s install jedit openjdk-9-jre
NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  ca-certificates-java java-common java-wrappers libatk-wrapper-java libatk-wrapper-java-jni openjdk-9-jre-headless
Suggested packages:
  default-jre icedtea-8-plugin fonts-indic
The following NEW packages will be installed:
  ca-certificates-java java-common java-wrappers jedit libatk-wrapper-java libatk-wrapper-java-jni openjdk-9-jre
  openjdk-9-jre-headless
0 upgraded, 8 newly installed, 0 to remove and 11 not upgraded.
Inst java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Inst ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all]) []
Inst java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all]) []
Inst openjdk-9-jre-headless (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Inst libatk-wrapper-java (0.33.3-6 Ubuntu:16.04/xenial [all])
Inst libatk-wrapper-java-jni (0.33.3-6 Ubuntu:16.04/xenial [amd64])
Inst openjdk-9-jre (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Inst jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Conf java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Conf java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all])
Conf ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all])
Conf openjdk-9-jre-headless (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Conf libatk-wrapper-java (0.33.3-6 Ubuntu:16.04/xenial [all])
Conf libatk-wrapper-java-jni (0.33.3-6 Ubuntu:16.04/xenial [amd64])
Conf openjdk-9-jre (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Conf jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])

Если я установил jedit и openjdk-9-jre с двумя отдельными sudo apt-get install команды, данные в том порядке, затем, я получил бы и OpenJDK 8 и пакеты OpenJDK 9.

15
ответ дан 21 December 2019 в 23:45

Если даже один пакет из очень длинного списка пакетов не может быть установлен, то выполнение команды остановится, и это распечатает информативное сообщение об ошибке. Может также быть печально установить длинный список пакетов в одном пакете, потому что некоторые пакеты потребуют интерактивного ввода данных пользователем в терминале, чтобы быть установленными успешно. Если Вы делаете ошибку во вводе данных пользователем затем, необходимо будет перезапустить процесс полной установки с начала.

Трудно заставить команду выполняться успешно до конца, если Вы не разделяете первоначальный длинный список пакетов в группы из 25-40 пакетов и затем устанавливаете пакеты с Кв. одна группа за один раз. Это не занимает много дополнительного времени и делает установку всех пакетов легче справиться.

Просто помните еще одну вещь. sudo apt install блокирует административный каталог (/var/lib/dpkg/) когда это работает, не выполняйте никакой другой процесс, который требует полномочий пользователя root, пока Кв. полностью не заканчивает обрабатывать. Например, при установке пакетов с Кв. от терминала не пытайтесь установить другие поспешные пакеты от терминала на новой вкладке или окне до способной обработки концов.

7
ответ дан 21 December 2019 в 23:45

Другие вопросы по тегам:

Похожие вопросы: