Gibt es eine Liste von Entwicklungspaketen (z. B. pkgs="python3.5-dev python3-tk")? Wäre es dann ein Unterschied, ob man
sudo apt-get install $pkgs
Vergleiche
for p in $pkgs; do sudo apt-get install $p; done
Ich frage vor allemAbhängigkeiten-Topo-Sortierungverbunden, d. h. werden in beiden Fällen unterschiedliche Pakete heruntergeladen und installiert?
Antwort1
Ja, um Abhängigkeiten zu erfüllen, können unterschiedliche Pakete ausgewählt werden.Ausführen eines Befehls, der angibtNPakete zu installieren haben manchmal eine andere Wirkung als das AusführenNBefehle, von denen jeder 1 zu installierendes Paket angibt, selbst wenn die tatsächlich angegebenen Pakete in jedem Fall dieselben sind.
Die HauptpraktischDer Unterschied ist wahrscheinlich derkarel hat beschrieben.Aufgrund der unterschiedlichen Abhängigkeitsauflösung können die Auswirkungen jedoch auch dann unterschiedlich sein, wenn alle Vorgänge erfolgreich sind.
Der Grund ist, wie Sie im Großen und Ganzen vermutet haben:
Ich frage vor allemAbhängigkeiten-Topo-Sortierungverwandt
Genauer gesagt liegt dies daran, dass es mehr als eine Alternative geben kann, die eine Abhängigkeit erfüllt.
Abstrakte Erklärung
Angenommen, Sie möchten das Paket installierena
, die abhängig ist vonvirtuelles Paket v
, Undv
kann per Paket erfüllt werdenb
oder Paketc
und auf keine andere Weise. Angenommen,b
hängt nicht ab vonc
,c
hängt nicht ab vonb
, und keines dieser Pakete ist bereits installiert. Nehmen wir nun an, Sie führen Folgendes aus:
sudo apt-get install a
Anschließend wählt APTb
oderc
um die Abhängigkeit zu erfüllen. Welches es auswählt, ist das Ergebnis einer Berechnung, die es durchführt und die davon beeinflusst werden kann, welche Pakete Sie installiert haben, welche Pakete verfügbar sind, welche Version von APT Sie verwenden und wie es konfiguriert ist. Aber wenn alle diese Bedingungen gleich sind, wird die Entscheidung jedes Mal gleich getroffen.
Vermutenohne Einschränkung der Allgemeinheitdass es auswähltb
. Danna
Undb
sind installiert. Angenommen, Sie führen dann Folgendes aus:
sudo apt-get install c
Danach,a
,b
, Undc
sind alle installiert. Das heißt, alle drei Pakete wurden installiert, als Folgendes ausgeführt wurde:
sudo apt-get install a
sudo apt-get install c
Im Gegensatz, nehmen Sie an, Sie würden diesen Befehl anstelle der folgenden ausführen:
sudo apt-get install a c
Dann, seita
Abhängigkeit vonv
ist zufrieden durchc
,b
ist nicht installiert. Das heißt, nura
Undc
, aber nichtb
, werden als Folge der Ausführung von Folgendem installiert:
sudo apt-get install a c
Konkretes Beispiel
Konkrete Beispiele hierfür finden Sie, indem Sie apt
oder apt-get
mit der -s
Option ausführen, wodurch Ihre Aktion simuliert wird, anstatt sie auszuführen. (Denken Sie daran, dass Sie sie nicht nur mit apt-get -s
/ vollständig bestätigen können apt -s
, da frühere apt-get -s
/ apt -s
-Befehle spätere nicht beeinflussen, da sie nichts bewirken, da es sich nur um Simulationen handelt.)
sudo apt-get install jedit
Auf meinem Ubuntu 16.04 LTS-System würden mehrere OpenJDK 8-Pakete installiert :
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])
Wenn ich APT anweise, sowohl jedit
als auch openjdk-9-jre
durch Ausführen zu installieren sudo apt-get install jedit openjdk-9-jre
, würde es die OpenJDK 8-Pakete nicht installieren, da jedit
die Abhängigkeit von von einer Java-Runtime durch OpenJDK 9-Pakete erfüllt wird:
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])
Wenn ich jedit
es openjdk-9-jre
mit zwei separaten sudo apt-get install
Befehlen in dieser Reihenfolge installiert hätte, hätte ich sowohl OpenJDK 8- als auch OpenJDK 9-Pakete erhalten.
Antwort2
Wenn auch nur ein Paket aus einer sehr langen Liste von Paketen nicht installiert werden kann, wird die Ausführung des Befehls abgebrochen und eine informative Fehlermeldung ausgegeben. Es kann auch frustrierend sein, eine lange Liste von Paketen in einem Stapel zu installieren, da einige der Pakete interaktive Benutzereingaben im Terminal erfordern, um erfolgreich installiert zu werden. Wenn Sie bei der Benutzereingabe einen Fehler machen, müssen Sie den gesamten Installationsvorgang von Anfang an neu starten.
Es ist schwierig, den Befehl bis zum Ende erfolgreich auszuführen, es sei denn, Sie teilen die anfängliche lange Liste der Pakete in Gruppen von 25-40 Paketen auf und installieren die Pakete dann mit apt gruppenweise. Dies nimmt nicht viel zusätzliche Zeit in Anspruch und erleichtert die Installation aller Pakete.
Denken Sie nur noch an eines. sudo apt install
sperrt das Verwaltungsverzeichnis ( /var/lib/dpkg/
), wenn es ausgeführt wird. Führen Sie daher keinen anderen Prozess aus, der Root-Berechtigungen erfordert, bis apt die Verarbeitung vollständig abgeschlossen hat. Wenn Sie beispielsweise Pakete mit apt vom Terminal aus installieren, versuchen Sie nicht, andere Snap-Pakete vom Terminal aus in einem neuen Tab oder Fenster zu installieren, bis apt die Verarbeitung abgeschlossen hat.