
Wenn ich apt-get versehentlich verwende, um ein Paket zu installieren, das bereits als Abhängigkeit eines anderen Pakets installiert ist, wird diese „Abhängigkeit“ unterbrochen, indem das Paket als manual
statt als markiert wird auto
.
Ich kann dies später manuell beheben, indem ich verwende sudo apt-mark markauto package-name
.
Gibt es eine Möglichkeit, apt-get (oder aptitude, dpkg oder ein anderes Tool) anzuweisen, die Verknüpfung gar nicht erst zu unterbrechen oder nichts zu tun, wenn das angeforderte Paket bereits installiert ist?
Ich stoße auf verschiedene Arten darauf:
Ich habe eine Liste mit Paketen, die ich installieren muss, damit etwas Bestimmtes funktioniert (aus Anweisungen auf einer Website wie dieser).
Ich habe eine Liste aller Pakete, die ich zu einer Installation hinzugefügt habe, und kopiere sie, sodass sie alle zu einer anderen Installation hinzugefügt werden – beispielsweise wenn ich eine Neuinstallation statt einer Aktualisierung meines Systems durchführe.
Antwort1
Du sagtest
Wenn ich apt-get versehentlich verwende, um ein Paket zu installieren, das bereits als Abhängigkeit eines anderen Pakets installiert ist, wird diese "Abhängigkeit" aufgehoben, indem das Paket als
manual
statt als markiert wird.auto
Ich glaube, du hast es ein wenig falsch verstanden. Es wird die Abhängigkeitskette nicht unterbrechen. Das andere Paket hängt immer noch davon ab.als manuell gekennzeichnetPaket. Das einzige, was betroffen ist, ist, dass, wenn Sie apt-get autoremove
diese jetzt ausführenals manuell gekennzeichnetPakete werden nicht entfernt. Denn als apt
manuell markiert bedeutet, dass der Benutzer sie absichtlich installiert hat und nicht, weil er andere Pakete wollte, die wiederum von diesen Paketen abhängig waren.
Du hast gefragt
Gibt es eine Möglichkeit, apt-get (oder aptitude, dpkg oder ein anderes Tool) anzuweisen, die Verknüpfung gar nicht erst zu unterbrechen oder nichts zu tun, wenn das angeforderte Paket bereits installiert ist?
Ich habe bisher keine Tools gefunden, die das automatisch machen. Aber das klingt auch nicht logisch. Denn in diesem Fall wäre es so, als ob alle Pakete, die Sie installieren, gesperrt wären automatically installed
, was sie anfällig für apt-get autoremove
Befehle macht.
Wenn Sie also möchten, dass ein Paket alsautomatisch installiertObwohl die Installation manuell durchgeführt wurde, müssen Sie apt-get markauto
oder verwenden aptitude mark-auto
.
Antwort2
Wenn dies mit einem vorhandenen Tool nicht möglich ist, gibt es hier eine Problemumgehung.
Führen Sie jedes Paket durch ein Bash-Skript wie das folgende aus:
#!/bin/bash
dpkg -s "$1" &> /dev/null
(($?)) && sudo apt-get install "$1"
dpkg -s
Gibt 0 zurück, wenn das Paket (als Argument für das Skript angegeben) installiert ist; 1, wenn nicht. Dieses Skript tut nichts, wenn das Paket installiert ist, installiert es aber, wenn es nicht installiert ist – und vermeidet so das ursprüngliche Problem.
Der dpkg
Befehl gibt eine Menge Informationen aus, die hier nicht benötigt werden. Deshalb werden sie in den /dev/null
Bit-Bucket umgeleitet, um sie zu löschen.
(($?))
sieht sich den Rückgabecode von an dpkg
. Es funktioniert wie C – das Gegenteil von normalen Bash-Tests. Wenn $?
1 ist, weil das Paket nicht installiert ist, wird dies als wahr ausgewertet und löst die &&
Klausel zum Installieren des Pakets aus.
Je nach Bedarf kann dies in eine Funktion umgewandelt und/oder in eine Schleife über eine Liste von Paketnamen eingefügt werden.
Wenn dies häufig verwendet würde, würde auch Code hinzugefügt, um zu überprüfen, ob das Argument $1
nicht null ist und keine eingebetteten Leerzeichen oder anderen Müll enthält. Aber all das ist nur normales Scripting und nicht Teil der Lösung selbst.
Ich fand die dpkg
TechnikHier.