Учитывая список пакетов разработки (например, pkgs="python3.5-dev python3-tk"), будет ли разница между запуском
sudo apt-get install $pkgs
против.
for p in $pkgs; do sudo apt-get install $p; done
Я спрашиваю в основномзависимости-топосортировкасвязанные, т.е. будут ли разные пакеты загружены и установлены в любом случае
решение1
Да, можно выбирать разные пакеты для удовлетворения зависимостей.Выполнение 1 команды, которая указываетНпакеты, которые нужно установить, иногда будут иметь другой эффект от запускаНкоманды, каждая из которых указывает на один пакет для установки, даже если фактически указанные пакеты в каждом случае одинаковы.
ГлавныйпрактичныйРазница, вероятно, однаКарел описал.Однако даже если все операции выполнены успешно, последствия могут различаться из-за различного разрешения зависимостей.
Причина, как вы в общих чертах и предположили:
Я спрашиваю в основномзависимости-топосортировкасвязанный
Конкретнее, это происходит потому, что может быть более одной альтернативы, удовлетворяющей зависимости.
Абстрактное объяснение
Предположим, вы хотите установить пакет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.
решение2
Если даже один пакет из очень длинного списка пакетов не может быть установлен, то выполнение команды остановится и выведет информативное сообщение об ошибке. Также может быть неприятно устанавливать длинный список пакетов за один раз, поскольку некоторые из пакетов потребуют интерактивного ввода данных пользователем в терминале для успешной установки. Если вы допустите ошибку во вводе данных пользователем, то вам придется перезапустить весь процесс установки с самого начала.
Трудно добиться успешного выполнения команды до конца, если только вы не разделите первоначальный длинный список пакетов на группы по 25-40 пакетов, а затем не установите пакеты с помощью apt по одной группе за раз. Это не займет много дополнительного времени и сделает установку всех пакетов более простой в управлении.
Просто запомните еще одну вещь. sudo apt install
блокирует административный каталог ( /var/lib/dpkg/
) во время работы, поэтому не запускайте никаких других процессов, требующих привилегий root, пока apt полностью не завершит обработку. Например, если вы устанавливаете пакеты с помощью apt из терминала, не пытайтесь установить другие пакеты snap из терминала в новой вкладке или окне, пока apt не завершит обработку.