Prüfen Sie, ob ein apt-get-Paket installiert ist und installieren Sie es dann, wenn es nicht auf Linux?
Arbeite ich auf einem Ubuntu-system und aktuell dies ist, was ich Tue:
if ! which command > /dev/null; then
echo -e "Command not found! Install? (y/n) \c"
read
if "$REPLY" = "y"; then
sudo apt-get install command
fi
fi
Ist es das, was die meisten Menschen tun würden? Oder gibt es eine elegantere Lösung?
- Befehl Namen, die nicht unbedingt den Namen des Pakets Sie sind zu gehören. Was ist, du bist in größeren Ziel? Warum gehst du nicht einfach versuchen, es zu installieren, und schlimmsten Fall wird es nicht, da es bereits installiert ist.
- Glücklicherweise apt-get install ist idempotent, so ist es sicher zu laufen, nur Sie und keine sorgen über, ob es installiert ist oder nicht.
- der Kommentar sollte eine Antwort, dass würde die meisten Stimmen erhalten.
- Antwort gemacht.
- Verwandte, die Sie verwenden sollten
command -v <command>
; nichtwhich <command>
. Siehe auch Überprüfen Sie, ob ein Programm existiert, aus einem Bash-Skript. - Nicht ganz; laufende install auf ein bereits installiertes Paket aktualisieren Sie es, wenn es out-of-date. In der Regel wünschenswert zu halten up-to-date für die Sicherheit, aber könnte überraschend sein, wenn Stabilität erwünscht ist.
- Das ist ein sehr guter Punkt @Izkata
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um zu überprüfen, ob
packagename
installiert wurde, geben Sie ein:Können Sie auch
dpkg-query
hat, die ein ordentlicher Ausgang für Ihre Zwecke, und akzeptiert wild cards, zu.Zu finden, was Paket besitzt die
command
versuchen:Für weitere details, siehe Artikel Finden Sie heraus, wenn das Paket installiert ist, in Linux und dpkg-Spickzettel.
if
Nutzung. Ich bin auch auf der Suche nachif
Nutzung.dpkg -s
zurück 1 auf der fehlenden Pakete, und sonst 0, wie es sein sollte. Wie anders war auf älteren (oder neueren) Versionen?if
- Anweisung. Gibt es irgendein Szenario, in dem es nicht zuverlässig?dpkg -s
gibt null zurück, wenn ein Paket installiert wurde, und dann entfernt - in diesem Fall ist esStatus: deinstall ok config-files
oder ähnliches, so ist es "ok" - so zu mir, dies ist nicht ein sicherer test.dpkg-query -l
doesnt scheinen Rückkehr ein brauchbares Ergebnis, in diesem Fall entweder.dpkg -s <package> | grep Status
Nicht die hübscheste Lösung, aber Sie können nur tun, ein bisschen string-Analyse auf der Rückgabewert für diesen Befehl, wenn Sie wollen eine mehr ausführliche Antwort.Werden, ein wenig deutlicher wird, hier ein bisschen bash-Skript, dass prüft, ob ein Paket und installiert es, falls erforderlich. Natürlich können Sie andere Dinge tun, auf Feststellung, dass das Paket fehlt, wie einfach beenden mit einer Fehlermeldung.
Wenn das Skript läuft in einer GUI (z.B. es wird ein Nautilus-Skript), werden Sie wahrscheinlich wollen, ersetzen Sie die 'sudo' - Aufruf mit 'gksudo' ein.
--force-yes
scheint eine schlechte Idee. Aus der Manpage: "Dies ist eine gefährliche option, die Ursache apt-get veranlasst, ohne Nachfrage fortzufahren, wenn es etwas zu tun potenziell schädlich. Es sollte nicht verwendet werden, außer in sehr speziellen Situationen. Mit --force-yes zu benutzen, kann potenziell zerstören dein system!" Verwenden Sie es in ein Skript macht es noch schlimmer.Diese one-liner gibt 1 (installiert) oder 0 (nicht installiert) für die 'nano' - Paket..
selbst wenn das Paket nicht vorhanden /ist nicht vorhanden.
Beispiel unten installiert die 'nano' - Paket, wenn es nicht installiert ist..
dpkg-query -W -f='${Status}' MYPACKAGE | grep -q -P '^install ok installed$'; echo $?
grep -P
für eine einfache regex so.grep -c
wenn die Aufgabe ist nicht, um tatsächlich die Anzahl der Ereignisse ist Objektiv besser.if ! dpkg-query -W -f='${Status}' nano | grep "ok installed"; then apt install nano; fi
-- Keine Notwendigkeit zu verwendengrep -c
verwenden Sie einfach den exit-status vongrep
Biete ich dieses update seit Ubuntu fügte seinem "Personal Package Archiv" (PPA) nur, wie diese Frage beantwortet wurde, und PPA-Pakete zu einem anderen Ergebnis.
Native Debian-repository-Paket nicht installiert ist:
PPA-Paket registriert, die auf host und installiert:
PPA-Paket registriert auf Rechner, aber nicht installiert:
Ebenfalls geschrieben am: https://superuser.com/questions/427318/test-if-a-package-is-installed-in-apt/427898
dpkg -s
programmatische VerwendungIch mag
dpkg -s
als es beendet sich mit status1
wenn eines der Pakete nicht installiert ist, so dass es leicht zu automatisieren:man dpkg
nicht dokumentiert ist, den exit-status leider, aber ich denke es sollte ziemlich sicher auf Sie verlassen:Siehe auch:
Getestet auf Ubuntu 18.10.
UpAndAdam schrieb:
In meine Erfahrung, die Sie kann verlassen sich auf dkpg der exit-codes.
Den return-code des dpkg -s ist 0 wenn das Paket installiert ist und 1 wenn es nicht ist, so ist die einfachste Lösung, die ich fand, war:
Funktioniert gut für mich...
apt-get remove <package>
,dpkg -s <package>
noch gibt 0 zurück, obwohl das Paketdeinstalled
Dieser scheint ziemlich gut zu funktionieren.
0
wenn nicht installiert ist oder eine gewisse Anzahl> 0
wenn Sie installiert werden.grep | wc -l
ist ein antipattern. Um zu überprüfen, ob etwas existiert, Sie wollen einfachgrep -q
. Tatsächlich zählen der vorkommen (das ist selten nützlich, in dieser Art von Szenario), verwenden Siegrep -c
.dpkg -s zip | grep -c "Package: zip"
? (mit zip als Probe-Paket)grep -q 'Package: zip'
zurückgeben, exit-code, der angibt, ob oder nicht das Ergebnis gefunden wurde, ohne etwas ausdrucken zu müssen.Ich gefunden habe, alle oben genannten Lösungen können zu einem false positiv, wenn ein Paket installiert ist und entfernt dann noch die Installations-Pakets, bleibt auf dem system.
Replizieren:
Paket installieren
apt-get install curl
Entfernen Paket
apt-get remove curl
Nun test über Antworten.
Den folgenden Befehl scheint, um dieses Problem zu lösen Zustand:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'
Dies führt zu einem endgültigen
installiert oder nicht installiert
config-files
- also ich denke, eine endgültige| grep -q "installed"
ist wirklich nötig, um eine funktionsfähige exit-code-status.| grep -q '^installed$'
Habe ich sich auf eine auf der Grundlage Nultyi Antwort:
Grundsätzlich die Fehlermeldung aus
dpkg --get-selections
ist viel einfacher zu analysieren, als die meisten anderen, weil es nicht Zustände wie "deinstallieren". Es kann auch überprüfen Sie mehrere Pakete gleichzeitig, etwas, was Sie nicht tun können, nur mit Fehler-codes.Erklärung/Beispiel:
Also grep entfernt installierte Pakete aus der Liste, und awk zieht den Paket-Namen aus der Fehlermeldung, was
MISSING='python3-venv python3-dev jq'
, die trivial eingefügt in einen install-Befehl.Ich bin nicht blind Erteilung einer
apt-get install $PACKAGES
da wie bereits erwähnt in den Kommentaren, kann dies unerwartet upgrade-Pakete, die Sie nicht planen, auf; nicht wirklich eine gute Idee für automatisierte Prozesse, die zu erwarten sind, stabil zu sein.command -v <command>
; nichtwhich <command>
. Siehe auch Überprüfen Sie, ob ein Programm existiert, aus einem Bash-Skript.Diese wird es tun.
apt-get install
ist idempotent.apt-get install
auf ein Paket unerwünscht ist, wo das Paket bereits installiert ist, obwohl der Befehl selbst ist idempotent. In meinem Fall, ich bin der Installation eines Pakets auf einem remote-system mit Ansible ist eine raw-Modul, die berichten das system so geändert, jedes mal, wenn ichapt-get install
wahllos. Eine bedingte löst dieses problem.Verwenden:
Wenn es nicht installiert ist, wird es zeigen:
Sonst wird es zeigen:
Diese Funktion existiert bereits in Ubuntu und Debian, in der
command-not-found
Paket.command-not-found
ist ein interaktiver Helfer, nicht ein Werkzeug, um sicherzustellen, dass Sie haben die Abhängigkeiten, die Sie wollen. Natürlich, die richtige Art und Weise zu erklären Abhängigkeiten zum Paket Ihrer software in ein Debian-Paket und füllen Sie dieDepends:
Erklärung in dem Paket istdebian/control
Datei richtig.scheint die einfachste Weg, es zu tun außerhalb von dpkg und älteren apt-* tools
command -v <command>
; nichtwhich <command>
. Siehe auch Überprüfen Sie, ob ein Programm existiert, aus einem Bash-Skript.Ich hatte eine ähnliche Anforderung beim ausführen lokal testen, anstatt Sie im Andockfenster. Im Grunde wollte ich nur installieren .deb-Dateien, gefunden, wenn Sie nicht bereits installiert ist.
Ich denke, dass Sie nur problem, das ich sehen kann, ist, dass es nicht überprüfen Sie die Versionsnummer des Pakets, also wenn .deb-Datei ist eine neuere version, dann wäre dies nicht überschreiben des aktuell installierten Pakets.
Für Ubuntu apt bietet eine ziemlich anständige Art und Weise, dies zu tun. Unten ist ein Beispiel für google chrome:
apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable
Ich bin Umleitung der error-Ausgang auf null, weil apt warnt gegen die Verwendung seiner "instabilen cli". Ich vermute, die Liste Paket ist stabil, so dass ich denke, es ist ok zu werfen, diese Warnung Weg. Die -qq macht apt super leise.
Dieser Befehl ist der schönste:
Wenn es installiert ist, druckt es:
Sonst druckt er
Getestet wurde dies auf Ubuntu 12.04.1 (Precise Pangolin).
dpkg --get-selections <package-name>
nicht der exit-code ungleich null, wenn das Paket nicht gefunden wird.Viele Dinge wurden gesagt, aber für mich einfachste Weg ist:
In Der Bash:
Beachten Sie, dass Sie einen string mit mehreren Paketen in der PKG.
Ich den folgenden Weg verwenden:
Es scheint, dass heutzutage
apt-get
hat eine option--no-upgrade
dass nur das tut, was der OP will:Manpage von https://linux.die.net/man/8/apt-get
Daher können Sie
sowie
package
wird nur installiert werden, wenn es nicht.