Jak mogę sprawdzić, czy pakiet jest zainstalowany (bez uprawnień administratora)?

56

Na naszej uczelni możemy zainstalować prawie każdy pakiet ubuntu, jaki chcemy, ale sami nie jesteśmy administratorami (musimy poprosić o zainstalowanie pakietów).

W przypadku niektórych bibliotek nie zawsze łatwo jest stwierdzić, czy pakiet jest już zainstalowany, czy nie. Czy istnieje prosty sposób / polecenie, aby to sprawdzić?

Peter Smit
źródło

Odpowiedzi:

56
apt-cache policy <package name>
Oli
źródło
7
Ważne jest, aby wiedzieć, że obsługuje uzupełnianie tabulatorów w nazwie pakietu. Jest to więc bardzo przydatne, nawet jeśli nie znasz dokładnej nazwy pakietu.
Javier Rivera,
Szkoda, że ​​wciąż wychodzi ze statusem 0, nawet jeśli pakiet nie jest obecny. dpkg -srobi jednak: askubuntu.com/a/1108801/52975
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Z bardziej przyjaznymiapt : apt policy <package name>lub apt show <package name>po więcej informacji.
Pablo A
18

Zawsze używam tego z wiersza poleceń:

dpkg -l | grep mysql

więc powyższe prosi dpkg o wyświetlenie listy wszystkich zainstalowanych pakietów, a następnie grepuję tylko dla tych, które mają mysql w nazwie.

Stóg
źródło
3
dpkg -l "*mysql*"działa również i nie ukrywa linii objaśniających na wyjściu.
Philipp Wendler,
dpkg -l "*mysql*"(lub dpkg -l '*mysql*') wprowadza również specjalne formatowanie danych wyjściowych, aby pasowały do ​​każdego pakietu w jednym wierszu okna terminala (grep nie). Ten formularz pozwala wybrać format symboli wieloznacznych (przedrostków lub sufiksów) i określić, czy w ogóle używać symboli wieloznacznych (w porównaniu z grep). Ale grep daje ładne zabarwienie ..))
vstepaniuk
7

Jeszcze jeden wariant, tym razem wykorzystujący aptitude:

aptitude show <package>

Działa tu także uzupełnianie kart.

Aleksiej Nedilko
źródło
6

Możesz użyć dselect. Zapewnia dostęp tylko do odczytu.

Ponadto, dpkg -s <package name>zapewnia wiele szczegółów związanych z pakietem. Na przykład"

userme:~$ dpkg-query -s sl
Package: sl
Status: unknown ok not-installed
Priority: optional
Section: games
Abhinav
źródło
Jest to również dostępne jako sprawiedliwe dpkg -s. I odwrotnie, dpkg-query -ldziała tak samo dobrze dpkg -llubdpkg --list
belacqua
4

Możesz użyć dpkg-query -s <package> 2>/dev/null | grep -q ^"Status: install ok installed"$ w skryptach, ponieważ zwraca kod wyjścia 1, jeśli <package>nie jest zainstalowany, i 0, jeśli <package>jest zainstalowany.

jarno
źródło
4
Uważaj : jeśli dpkg -szwróci 0, nie musi to oznaczać, że pakiet jest w pełni / poprawnie zainstalowany. dpkg -szwraca również, 0jeśli pakiet jest w stanie half-configuredlub jest w config-filesstanie (i chyba też half-installed, ale nie sprawdziłem tego). Zobacz [stronę man dpkg( manpages.ubuntu.com/manpages/oneiric/man1/dpkg.1.html ), aby dowiedzieć się więcej na temat „niekompletnych” stanów.
Ignitor,
1
@Ignitor, dobry punkt. Moja odpowiedź była zła. Paczkę można nawet usunąć, ale nie można jej wyczyścić. Myślę więc, że musisz sprawdzić dane wyjściowe, aby sprawdzić, czy pakiet jest zainstalowany, czy nie.
jarno
2
Zredagowałem odpowiedź. Teraz opiera się na danych wyjściowych dpkg-query. Nie wiem, jak przenośne jest to rozwiązanie; na przykład, czy tekst może być wyświetlany w innym języku w jakimś systemie?
jarno
2

Prostsze rozwiązanie:

Teraz jest apt listpolecenie, które wyświetla listę zainstalowanych pakietów. Możesz także wyszukać konkretny pakiet za pomocą

apt list <package>

Zobacz man aptwięcej informacji.

sk8forether
źródło
1
I apt showpo więcej szczegółów
wjandrea
0

dpkg -s programowe użycie

Podoba mi się, dpkg -sgdy kończy pracę ze statusem, 1jeśli którykolwiek z pakietów nie jest zainstalowany, co ułatwia automatyzację:

pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
  sudo apt-get install $pkgs
fi

Zobacz też:

Testowane na Ubuntu 18.10.

Ciro Santilli
źródło
0

Przykład użycia określonej wartości jako var w skryptach powłoki (np. test.sh)

#!/bin/sh
PACKAGE="${1}"
INSTALLED=$(dpkg -l | grep ${PACKAGE} >/dev/null && echo "yes" || echo "no")

echo "${PACKAGE} is installed ... ${INSTALLED}"

Ustaw go jako wykonywalny i zacznij od:

test.sh openssh-server

Lub rób co chcesz w swoich skryptach

Lahmizzar
źródło
0

Musisz sprawdzić status wydrukowany przez dpkg -l, na przykład:

$ dpkg -l firefox-esr vim winff
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                 Version                 Architecture            Description
+++-====================================-=======================-=======================-=============================================================================
hi  firefox-esr                          52.9.0esr+build2-0ubunt amd64                   Safe and easy web browser from Mozilla
ii  vim                                  2:8.1.1198-0york0~14.04 amd64                   Vi IMproved - enhanced vi editor
rc  winff                                1.5.3-3                 all                     graphical video and audio batch converter using ffmpeg or avconv

Tutaj zarówno vimi firefox-esrsą zainstalowane, więc można wpisać:

$ dpkg -l firefox-esr | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is installed.
$ dpkg -l vim | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is installed.
$ dpkg -l winff | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is NOT installed.
SebMa
źródło