Gibt es einen Unterschied zwischen dem Herunterladen/Installieren einer Paketliste und dem Herunterladen jedes einzelnen Pakets?

Gibt es einen Unterschied zwischen dem Herunterladen/Installieren einer Paketliste und dem Herunterladen jedes einzelnen Pakets?

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, Undvkann per Paket erfüllt werdenboder Paketcund auf keine andere Weise. Angenommen,bhängt nicht ab vonc,chä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 APTbodercum 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. DannaUndbsind installiert. Angenommen, Sie führen dann Folgendes aus:

sudo apt-get install c

Danach,a,b, Undcsind 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, seitaAbhängigkeit vonvist zufrieden durchc,bist nicht installiert. Das heißt, nuraUndc, 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 aptoder apt-getmit der -sOption 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 jeditAuf 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 jeditals auch openjdk-9-jredurch Ausführen zu installieren sudo apt-get install jedit openjdk-9-jre, würde es die OpenJDK 8-Pakete nicht installieren, da jeditdie 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 jedites openjdk-9-jremit zwei separaten sudo apt-get installBefehlen 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 installsperrt 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.

verwandte Informationen