Ich arbeite an einem Ubuntu-System und derzeit mache ich Folgendes:
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
Würden die meisten Leute das tun? Oder gibt es eine elegantere Lösung?
command -v <command>
; nichtwhich <command>
. Siehe auch Überprüfen, ob ein Programm aus einem Bash-Skript vorhanden ist .Antworten:
Geben Sie Folgendes ein, um zu überprüfen, ob
packagename
installiert wurde:Sie können auch
dpkg-query
eine übersichtlichere Ausgabe für Ihren Zweck verwenden und auch Platzhalter akzeptieren.Um herauszufinden, welches Paket das besitzt
command
, versuchen Sie:Weitere Details finden Sie im Artikel Finden Sie heraus, ob das Paket unter Linux und im dpkg-Spickzettel installiert ist .
quelle
if
Verwendung gebeten . Ich suche auch nachif
Verwendung.dpkg -s
bei fehlenden Paketen 1 und ansonsten 0 zurück, wie es sollte. Wie war der Unterschied zu früheren (oder neueren) Versionen?dpkg -s
Gibt Null zurück, wenn ein Paket installiert und dann entfernt wurde - in diesem Fall ist esStatus: deinstall ok config-files
oder ähnlich, also "ok" - für mich ist dies also kein sicherer Test.dpkg-query -l
scheint auch in diesem Fall kein nützliches Ergebnis zu liefern.Um etwas genauer zu sein, hier ein kleines Bash-Skript, das nach einem Paket sucht und es bei Bedarf installiert. Natürlich können Sie auch andere Dinge tun, wenn Sie feststellen, dass das Paket fehlt, z. B. einfach mit einem Fehlercode beenden.
Wenn das Skript in einer GUI ausgeführt wird (z. B. ein Nautilus-Skript), möchten Sie wahrscheinlich den Aufruf "sudo" durch einen Aufruf "gksudo" ersetzen.
quelle
--force-yes
scheint eine schlechte Idee. Aus der Manpage: "Dies ist eine gefährliche Option, die dazu führt, dass apt-get ohne Aufforderung fortgesetzt wird, wenn es etwas potenziell Schädliches tut. Es sollte nur in ganz besonderen Situationen verwendet werden. Die Verwendung von --force-yes kann Ihr System möglicherweise zerstören ! " Die Verwendung in einem Skript macht es noch schlimmer.Dieser Einzeiler gibt 1 (installiert) oder 0 (nicht installiert) für das 'Nano'-Paket zurück.
auch wenn das Paket nicht existiert / nicht verfügbar ist.
Im folgenden Beispiel wird das 'nano'-Paket installiert, wenn es nicht installiert ist.
quelle
dpkg-query -W -f='${Status}' MYPACKAGE | grep -q -P '^install ok installed$'; echo $?
grep -P
einfachen regulären Ausdruck wie diesen.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
dpkg -s
programmatische Nutzung mit automatischer InstallationIch mag
dpkg -s
es,1
wenn es mit dem Status beendet wird, wenn eines der Pakete nicht installiert ist, was die Automatisierung vereinfacht:man dpkg
dokumentiert den Exit-Status leider nicht, aber ich denke, es sollte einigermaßen sicher sein, sich darauf zu verlassen:Eine Sache zu beachten ist, dass Laufen:
entfernt nicht unbedingt alle Dateien sofort für einige Pakete (aber für andere, nicht sicher warum?) und markiert nur das Paket zum Entfernen.
In diesem Zustand scheint das Paket weiterhin verwendbar zu sein und da seine Dateien noch vorhanden sind, wird es jedoch zum späteren Entfernen markiert.
Zum Beispiel, wenn Sie ausführen:
dann:
die ersten beiden
echo $?
geben aus0
, nur die dritte gibt aus1
Die Ausgabe für die erste
dpkg -s certbot
enthält:während der zweite sagt:
und es verschwindet erst nach der Säuberung:
Die Datei
/etc/logrotate.d/certbot
ist nachapt remove
, aber nicht nach dem System noch vorhanden--purge
.Die Datei
/usr/lib/python3/dist-packages/certbot/reporter.py
ist jedoch auch danach noch vorhanden--purge
.Ich verstehe nicht warum, aber mit dem
hello
Paket zeigt das zweitedpkg
nachapt remove
, dass das Paket bereits entfernt wurde ohne--purge
:Die Dokumentationen sind auch sehr unklar, zB:
wurde nicht entfernt,
certbot
als es als markiert wurdedeinstall
, obwohl diesman apt-get
darauf hinzudeuten scheint:Siehe auch:
Getestet unter Ubuntu 19.10.
Python-
apt
Paketapt
In Ubuntu 18.04 gibt es ein vorinstalliertes Python 3-Paket , das eine Python-Apt-Oberfläche verfügbar macht!Ein Skript, das prüft, ob ein Paket installiert ist, und es installiert, wenn nicht, finden Sie unter: So installieren Sie ein Paket mithilfe der Python-Apt-API
Hier ist eine Kopie als Referenz:
Überprüfen Sie
PATH
stattdessen, ob eine ausführbare Datei vorhanden istSiehe: Wie kann ich anhand eines Bash-Skripts überprüfen, ob ein Programm vorhanden ist?
quelle
sudo apt install hello; dpkg -s hello; echo $?; sudo apt remove hello; dpkg -s hello; echo $?
. Können Sie weitere Details angeben?Ich biete dieses Update an, da Ubuntu sein "Personal Package Archive" (PPA) hinzugefügt hat, als diese Frage beantwortet wurde, und PPA-Pakete ein anderes Ergebnis haben.
Native Debian-Repository-Paket nicht installiert:
Auf dem Host registriertes und installiertes PPA-Paket:
Auf dem Host registriertes, aber nicht installiertes PPA-Paket:
Ebenfalls veröffentlicht unter: /superuser/427318/test-if-a-package-is-installed-in-apt/427898
quelle
UpAndAdam schrieb:
In meiner Erfahrung , die Sie können auf dkpg die verlassen Exit - Codes.
Der Rückkehrcode von dpkg -s ist 0, wenn das Paket installiert ist, und 1, wenn dies nicht der Fall ist. Die einfachste Lösung, die ich gefunden habe, war:
Funktioniert gut für mich ...
quelle
apt-get remove <package>
wirddpkg -s <package>
immer noch 0 zurückgegeben, obwohl das Paketdeinstalled
Das scheint ziemlich gut zu funktionieren.
0
wenn es nicht installiert ist, oder eine Nummer,> 0
wenn es installiert ist.quelle
grep | wc -l
ist ein Antimuster. Um zu überprüfen, ob etwas vorhanden ist, möchten Sie einfachgrep -q
. Verwenden Sie diese Option, um Vorkommen tatsächlich zu zählen (was in solchen Szenarien selten nützlich ist)grep -c
.dpkg -s zip | grep -c "Package: zip"
? (mit zip als Beispielpaket)grep -q 'Package: zip'
einen Exit-Code zurückgeben, der angibt, ob das Ergebnis gefunden wurde, ohne etwas zu drucken.Ich habe mich aufgrund der Antwort von Nultyi für eine entschieden :
Grundsätzlich ist die Fehlermeldung von
dpkg --get-selections
viel einfacher zu analysieren als die meisten anderen, da sie keine Status wie "deinstallieren" enthält. Es können auch mehrere Pakete gleichzeitig überprüft werden, was nicht nur mit Fehlercodes möglich ist.Erklärung / Beispiel:
Daher entfernt grep installierte Pakete aus der Liste, und awk zieht die Paketnamen aus der Fehlermeldung heraus, was dazu führt
MISSING='python3-venv python3-dev jq'
, dass sie trivial in einen Installationsbefehl eingefügt werden können.Ich gebe nicht blind eine aus,
apt-get install $PACKAGES
da dies, wie in den Kommentaren erwähnt, unerwartet Pakete aktualisieren kann, die Sie nicht geplant haben. Keine gute Idee für automatisierte Prozesse, von denen erwartet wird, dass sie stabil sind.quelle
[[ ! -z $MISSING ]] && sudo apt-get install $MISSING
Ich habe festgestellt, dass alle oben genannten Lösungen ein falsches Positiv erzeugen können, wenn ein Paket installiert und dann entfernt wird, das Installationspaket jedoch auf dem System verbleibt.
So replizieren Sie: Paket installieren Paket
apt-get install curl
entfernen
apt-get remove curl
Testen Sie nun die obigen Antworten.
Der folgende Befehl scheint diese Bedingung zu lösen:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'
Dies führt zu einer endgültigen Installation oder Nichtinstallation
quelle
config-files
- daher denke ich, dass ein Finale| grep -q "installed"
wirklich erforderlich ist, um einen funktionalen Exit-Code-Status zu erhalten.| grep -q '^installed$'
Es scheint, dass es heutzutage
apt-get
eine Option gibt--no-upgrade
, die genau das tut, was das OP will:Manpage von https://linux.die.net/man/8/apt-get
Daher können Sie verwenden
und
package
wird nur installiert, wenn es nicht ist.quelle
quelle
command -v <command>
; nichtwhich <command>
. Siehe auch Überprüfen, ob ein Programm aus einem Bash-Skript vorhanden ist .Das wird es tun.
apt-get install
ist idempotent.quelle
apt-get install
eines Pakets unerwünscht ist, wenn das Paket bereits installiert ist, obwohl der Befehl selbst idempotent ist. In meinem Fall installiere ich ein Paket auf einem Remote-System mit Ansibles Raw-Modul, das das System jedes Mal als geändert meldet, wenn ichapt-get install
wahllos ausgeführt werde. Eine Bedingung löst dieses Problem.Verwenden:
Wenn es nicht installiert ist, wird Folgendes angezeigt:
Andernfalls wird Folgendes angezeigt:
quelle
Diese Funktion ist bereits in Ubuntu und Debian im
command-not-found
Paket enthalten.quelle
command-not-found
ist ein interaktiver Helfer und kein Tool, um sicherzustellen, dass Sie die gewünschten Abhängigkeiten haben. Der richtige Weg, Abhängigkeiten zu deklarieren, besteht natürlich darin, Ihre Software in ein Debian-Paket zu packen und dieDepends:
Deklaration in derdebian/control
Datei des Pakets ordnungsgemäß auszufüllen .scheint der einfachste Weg zu sein, dies außerhalb von dpkg und älteren apt- * Tools zu tun
quelle
quelle
command -v <command>
; nichtwhich <command>
. Siehe auch Überprüfen, ob ein Programm aus einem Bash-Skript vorhanden ist .Ich hatte eine ähnliche Anforderung, als ich den Test lokal anstatt im Docker ausführte. Grundsätzlich wollte ich nur gefundene .deb-Dateien installieren, die nicht bereits installiert waren.
Ich denke, das einzige Problem, das ich sehen kann, ist, dass die Versionsnummer des Pakets nicht überprüft wird. Wenn es sich also bei der .deb-Datei um eine neuere Version handelt, wird das aktuell installierte Paket nicht überschrieben.
quelle
Für Ubuntu bietet apt eine recht anständige Möglichkeit, dies zu tun. Unten finden Sie 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 leite die Fehlerausgabe auf null um, weil apt vor der Verwendung seiner "instabilen CLI" warnt. Ich vermute, dass das Listenpaket stabil ist, daher denke ich, dass es in Ordnung ist, diese Warnung wegzuwerfen. Das -qq macht apt super leise.
quelle
Dieser Befehl ist der denkwürdigste:
Wenn es installiert ist, wird Folgendes gedruckt:
Andernfalls wird gedruckt
Dies wurde unter Ubuntu 12.04.1 (Precise Pangolin) getestet.
quelle
dpkg --get-selections <package-name>
setzt den Exit-Code nicht auf ungleich Null, wenn das Paket nicht gefunden wird.Viele Dinge wurden erzählt, aber für mich ist der einfachste Weg:
quelle
In Bash:
Beachten Sie, dass Sie in PKG eine Zeichenfolge mit mehreren Paketen haben können.
quelle
Ich benutze folgenden Weg:
quelle