Jak sprawdzić z bash, czy pakiet istnieje w Debianie

12

Chciałbym napisać skrypt instalacyjny bash, w którym chciałbym zainstalować serwer MySQL.

W Linux Mint śledziłem kod:

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

ale zainstalowałem nowy Debian 8 i nie ma mysql-server- zamiast tego jest mariadb.

Jak mogę sprawdzić, czy pakiet istnieje?

Wiem tylko, że jest to, dpkg -sco powinno powiedzieć, czy pakiet jest zainstalowany.

Dusan Plavak
źródło
3
--force-yesdezaktywuje wszystkie zabezpieczenia, więc naprawdę możesz zepsuć system do punktu, w którym nie będzie żadnej naprawy. Ponadto: --force-yeszastępuje (dezaktywuje) -y. gdzie ta ostatnia może być opcją wyboru: Długa forma -yjest --assume-yesi właśnie to robi; Mówienie „tak”, aż stanie się naprawdę brzydkie, z ryzykowaniem spustoszenia wśród podstawowych elementów, podstaw itp. --forceZastępuje złamanie zabezpieczeń (nauczyłem się tego na
własnej skórze
Dodatek: Być może zainteresuje Cię --simulateopcja apt-getzrobienia --dry-run, na wszelki wypadek
erch
1
tylko dla wyjaśnienia: chcesz się dowiedzieć, czy paczka znajduje się w którymkolwiek z repozytoriów, które są zdefiniowane /etc/apt/sources.list, prawda?
wullxz
Zauważ, że faktycznie jest pakiet mysql-server w Debianie 8, obok mariadb: packages.debian.org/jessie/mysql-server
Dan Getz

Odpowiedzi:

13

(poniżej pochodzi z Ubuntu, ale ta sama technika oczywiście działa również na Debianie)

$ 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
...

Jeśli pakiet istnieje, zostaną wyświetlone informacje. Jeśli nie, zobaczysz coś takiego:

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

Dodatkowo kod wyjścia apt-cachebędzie niezerowy, jeśli nie zostaną znalezione pasujące pakiety.

Dodatkowa uwaga: jeśli używasz, gdy apt-cache show packagepakiet jest pakietem wirtualnym (taki, który nie istnieje, ale na przykład jest do niego odwoływany przez inne pakiety), otrzymasz:

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

Jest exit codeto zero (co moim zdaniem jest nieco mylące).

EEAA
źródło
3
wystarczy, aby zakończyć tę odpowiedź: można również przeszukiwać zdefiniowanych repozytoriów z sources.listtym poleceniem: apt-cache search *searchstring*. To polecenie przeszuka również opis pakietów i może pomóc ci znaleźć pakiety, w których nie znasz dokładnej nazwy pakietu.
wullxz
1
@wullxz, apt-cache search ...zwraca tylko dowolne dopasowania i aplikację. zwraca 0, nawet jeśli nic nie zostanie znalezione, co nie jest praktyczne w skrypcie bash.
Alexis Wilke,
4

Chciałbym użyć dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Sprawdzi, czy mysql-serverpakiet jest zainstalowany, a jeśli tak, wydrukuje ten fakt na ekranie. Bardziej wyrafinowanym rozwiązaniem byłoby bash (nieprzetestowane):

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

Można więc zrobić w skrypcie:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi
Gergely Polonkai
źródło
5
Myślę, że chce wiedzieć, czy pakiet w ogóle istnieje, a nie, czy jest już zainstalowany na lokalnej maszynie ...
wullxz
0

W jednej linijce:

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

wychodzi z 0, jeśli jest obecna, 1 jeśli nie.

Premia: skuteczne sprawdzenie wielu pakietów, wymienionych w pliku „packages_we_want”, po jednym w wierszu, posortowanych według sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantwyświetla listę wszystkich pakietów, które chcesz, ale nie istnieją w repozytoriach.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want wyświetla wszystkie pakiety, które chcesz i istnieją w repozytoriach.

Shnatsel
źródło