So überprüfen Sie anhand von Bash, ob das Paket in Debian vorhanden ist


12

Ich möchte ein Installations-Bash-Skript schreiben, in dem ich den MySQL-Server installieren möchte.

Unter Linux Mint hatte ich folgenden Code befolgt:

apt-get -y --force-yes install mysql-server-5.6

aber ich habe das neue Debian 8 installiert und es gibt kein mysql-server- stattdessen gibt es mariadb.

Wie kann ich herausfinden, ob ein Paket vorhanden ist?

Ich weiß nur, dass es dpkg -swelche gibt, die sagen sollten, ob ein Paket installiert ist.


3
--force-yesDeaktiviert alle Sicherheitsfunktionen, sodass Sie Ihr System wirklich so weit beschädigen können, dass keine Reparatur mehr möglich ist. Außerdem: --force-yesüberschreibt (deaktiviert) -y. wo letzteres die Option der Wahl sein könnte: Eine lange Form von -yist --assume-yes, und das ist, was es tut; Ja zu sagen, bis es wirklich hässlich werden könnte, mit dem Risiko von Chaos zwischen Kernelementen, Grundlagen usw., --forceüberschreibt die Sicherheit (lernte es auf die harte
Tour

Nachtrag: Sie könnten an der --simulateOption interessiert sein apt-get, eine --dry-run, nur für den Fall
erch

1
Nur zur Klarstellung: Sie möchten herausfinden, ob sich ein Paket in einem der in definierten Repositorys befindet /etc/apt/sources.list, oder?
Wullxz

Beachten Sie, dass es in debian 8 neben mariadb tatsächlich ein MySQL-Server-Paket gibt: packages.debian.org/jessie/mysql-server
Dan Getz

Antworten:


13

(Das Folgende ist von Ubuntu, aber die gleiche Technik funktioniert offensichtlich auch auf Debian)

$ apt-cache show screen
Package: screen
Priority: optional
Section: misc
Installed-Size: 950
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Axel Beckert <abe@debian.org>
Architecture: amd64
Version: 4.1.0~20120320gitdb59704-9
Depends: libc6 (>= 2.15), libpam0g (>= 0.99.7.1), libtinfo5
Suggests: iselect (>= 1.4.0-1) | screenie | byobu
Filename: pool/main/s/screen/screen_4.1.0~20120320gitdb59704-9_amd64.deb
Size: 645730
...

Wenn das Paket vorhanden ist, werden Informationen angezeigt. Wenn nicht, sehen Sie etwas wie:

$ apt-cache show foobar
N: Unable to locate package foobar
E: No packages found

Außerdem ist der Exit-Code von apt-cacheungleich Null, wenn keine passenden Pakete gefunden werden.

Zusätzlicher Hinweis: Wenn Sie apt-cache show packageein virtuelles Paket verwenden (eines, das nicht vorhanden ist, auf das jedoch beispielsweise von anderen Paketen verwiesen wird), erhalten Sie Folgendes:

N: Can't select versions from package 'package' as it is purely virtual
N: No packages found

Das exit codedavon ist Null (was meiner Meinung nach etwas irreführend ist.)


3
Nur um diese Antwort zu vervollständigen: Sie können die definierten Repositorys auch sources.listmit diesem Befehl durchsuchen : apt-cache search *searchstring*. Dieser Befehl durchsucht auch die Beschreibung von Paketen und kann Ihnen dabei helfen, Pakete zu finden, bei denen Sie den genauen Paketnamen nicht kennen.
Wullxz

1
@wullxz, nur die apt-cache search ...gibt irgendwelche Übereinstimmungen und die App zurück. gibt 0 zurück, auch wenn nichts gefunden wird, was in einem Bash-Skript nicht praktikabel ist.
Alexis Wilke

4

Ich würde verwenden dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Es wird geprüft, ob das mysql-serverPaket installiert ist, und wenn ja, wird diese Tatsache auf dem Bildschirm gedruckt. Eine ausgefeiltere Lösung wäre in bash (ungetestet):

function package_exists() {
    return dpkg -l "$1" &> /dev/null
}

So kann man in einem Skript machen:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi

5
Ich denke, er möchte wissen, ob das Paket überhaupt existiert und nicht, ob es bereits auf dem lokalen Computer installiert ist ...
wullxz

0

In einem Einzeiler:

apt-cache pkgnames | grep -q "\<$your_package_name\>"

Beendet mit 0, wenn es vorhanden ist, 1, wenn nicht.

Bonus: Effiziente Prüfung für mehrere Pakete, aufgeführt in der Datei "packages_we_want", eines pro Zeile, sortiert nach sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantlistet alle Pakete auf, die Sie möchten, die jedoch nicht in den Repositorys vorhanden sind.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want listet alle gewünschten und in den Repositorys vorhandenen Pakete auf.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.