Pracuję na systemie Ubuntu i obecnie robię to:
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
Czy to zrobiłoby większość ludzi? A może istnieje bardziej eleganckie rozwiązanie?
command -v <command>
; Niewhich <command>
. Zobacz także Sprawdź, czy program istnieje ze skryptu Bash .Odpowiedzi:
Aby sprawdzić, czy
packagename
został zainstalowany, wpisz:Możesz również użyć
dpkg-query
tego, który ma ładniejszy wynik dla twojego celu i akceptuje również dzikie karty.Aby dowiedzieć się, który pakiet jest właścicielem
command
, spróbuj:Aby uzyskać więcej informacji, zobacz artykuł Sprawdź, czy pakiet jest zainstalowany w systemie Linux i ściągawkę dpkg .
źródło
if
użycie. Szukam równieżif
zastosowania.dpkg -s
zwraca 1 w przypadku brakujących pakietów i 0 w przeciwnym razie, tak jak powinno. Czym różniły się wcześniejsze (lub najnowsze) wersje?dpkg -s
zwraca zero, jeśli pakiet został zainstalowany, a następnie usunięty - w takim przypadku jestStatus: deinstall ok config-files
podobny lub podobny, więc jest „ok” - więc dla mnie nie jest to bezpieczny test.dpkg-query -l
w tym przypadku nie wydaje się też przydatny wynik.Aby być bardziej precyzyjnym, oto skrypt bash, który sprawdza pakiet i instaluje go w razie potrzeby. Oczywiście możesz zrobić inne rzeczy po stwierdzeniu braku pakietu, na przykład po prostu wyjść z kodem błędu.
Jeśli skrypt działa w GUI (np. Jest to skrypt Nautilus), prawdopodobnie będziesz chciał zastąpić wywołanie „sudo” wywołaniem „gksudo”.
źródło
--force-yes
wydaje się kiepskim pomysłem. Ze strony podręcznika man: „Jest to niebezpieczna opcja, która spowoduje, że apt-get będzie kontynuował bez pytania, czy robi coś potencjalnie szkodliwego. Nie należy go używać z wyjątkiem bardzo szczególnych sytuacji. Użycie --force-yes może potencjalnie zniszczyć twój system ! ” Używanie go w skrypcie czyni go jeszcze gorszym.Ta linijka zwraca 1 (zainstalowany) lub 0 (nie zainstalowany) dla pakietu „nano”.
nawet jeśli pakiet nie istnieje / nie jest dostępny.
Poniższy przykład instaluje pakiet „nano”, jeśli nie jest zainstalowany.
źródło
dpkg-query -W -f='${Status}' MYPACKAGE | grep -q -P '^install ok installed$'; echo $?
grep -P
takiego prostego wyrażenia regularnego.if ! dpkg-query -W -f='${Status}' nano | grep "ok installed"; then apt install nano; fi
- Nie trzeba używaćgrep -c
, wystarczy użyć statusu wyjściagrep
dpkg -s
programowe użycie z automatyczną instalacjąPodoba mi się,
dpkg -s
gdy kończy pracę ze statusem,1
jeśli którykolwiek z pakietów nie jest zainstalowany, co ułatwia automatyzację:man dpkg
nie dokumentuje niestety statusu wyjścia, ale myślę, że należy na nim polegać:Należy zauważyć, że bieganie:
niekoniecznie natychmiast usuwa wszystkie pliki dla niektórych pakietów (ale robi to dla innych, nie wiesz dlaczego?) i po prostu zaznacza pakiet do usunięcia.
W tym stanie pakiet wydaje się być nadal użyteczny, a ponieważ jego pliki są nadal obecne, ale jest oznaczony do późniejszego usunięcia.
Na przykład, jeśli uruchomisz:
następnie:
pierwsze dwa
echo $?
wyjścia0
, tylko trzeci1
wynik pierwszego
dpkg -s certbot
zawiera:podczas gdy drugi mówi:
i znika dopiero po wyczyszczeniu:
plik
/etc/logrotate.d/certbot
jest nadal obecny w systemie poapt remove
, ale nie później--purge
.Jednak plik
/usr/lib/python3/dist-packages/certbot/reporter.py
jest nadal obecny, nawet po--purge
.Nie rozumiem dlaczego, ale z
hello
pakietem drugidpkg
poapt remove
pokazuje, że pakiet został już usunięty bez--purge
:Dokumentacje są również bardzo niejasne, np .:
nie usunął,
certbot
gdy został oznaczony jakodeinstall
, mimo żeman apt-get
wydaje się wskazywać, że:Zobacz też:
Testowane na Ubuntu 19.10.
apt
Pakiet PythonW
apt
Ubuntu 18.04 znajduje się preinstalowany pakiet Python 3, który udostępnia interfejs apt Python!Skrypt sprawdzający, czy pakiet jest zainstalowany i instaluje go, jeśli nie, można go zobaczyć pod adresem: Jak zainstalować pakiet za pomocą interfejsu API python-apt
Oto kopia w celach informacyjnych:
Sprawdź, czy
PATH
zamiast niego znajduje się plik wykonywalnyZobacz: Jak mogę sprawdzić, czy program istnieje ze skryptu Bash?
źródło
sudo apt install hello; dpkg -s hello; echo $?; sudo apt remove hello; dpkg -s hello; echo $?
. Czy możesz podać dalsze szczegóły?Oferuję tę aktualizację, ponieważ Ubuntu dodało swoje „Personal Package Archive” (PPA), podobnie jak odpowiedź na to pytanie, a pakiety PPA mają inny wynik.
Natywny pakiet repozytorium Debiana nie został zainstalowany:
Pakiet PPA zarejestrowany na hoście i zainstalowany:
Pakiet PPA zarejestrowany na hoście, ale nie zainstalowany:
Opublikowane również na: /superuser/427318/test-if-a-package-is-installed-in-apt/427898
źródło
UpAndAdam napisał:
Z mojego doświadczenia wynika, że możesz polegać na kodach wyjścia dkpg.
Kod powrotu dpkg -s wynosi 0, jeśli pakiet jest zainstalowany, i 1, jeśli nie jest, więc najprostszym rozwiązaniem, jakie znalazłem, było:
Działa dla mnie dobrze ...
źródło
apt-get remove <package>
,dpkg -s <package>
wciąż zwraca 0, mimo że pakiet todeinstalled
To wydaje się działać całkiem dobrze.
0
jeśli nie jest zainstalowany, albo pewną liczbę> 0
jeśli jest zainstalowany.źródło
grep | wc -l
jest antypatternem. Aby sprawdzić, czy coś istnieje, po prostu chceszgrep -q
. Aby faktycznie policzyć wystąpienia (co rzadko jest przydatne w tego rodzaju scenariuszu), użyjgrep -c
.dpkg -s zip | grep -c "Package: zip"
? (używając zip jako przykładowego pakietu)grep -q 'Package: zip'
zwrócić kod wyjścia, który wskazuje, czy wynik został znaleziony bez drukowania niczego.Zdecydowałem się na jeden oparty na odpowiedzi Nultyi :
Zasadniczo komunikat o błędzie z
dpkg --get-selections
jest znacznie łatwiejszy do przeanalizowania niż większość innych, ponieważ nie zawiera stanów takich jak „deinstalacja”. Może także sprawdzać wiele pakietów jednocześnie, czego nie można zrobić za pomocą samych kodów błędów.Objaśnienie / przykład:
Dlatego grep usuwa zainstalowane pakiety z listy, a awk wyciąga nazwy pakietów z komunikatu o błędzie, co powoduje
MISSING='python3-venv python3-dev jq'
, że można je w prosty sposób wstawić do polecenia instalacji.Nie wydam ślepo
apt-get install $PACKAGES
ponieważ jak wspomniano w komentarzach, może to nieoczekiwanie ulepszyć pakiety, których nie planowałeś; niezbyt dobry pomysł na zautomatyzowane procesy, które powinny być stabilne.źródło
[[ ! -z $MISSING ]] && sudo apt-get install $MISSING
Odkryłem, że wszystkie powyższe rozwiązania mogą dawać fałszywie dodatnie, jeśli pakiet zostanie zainstalowany, a następnie usunięty, ale pakiet instalacyjny pozostaje w systemie.
Aby powielić: Zainstaluj pakiet
apt-get install curl
Usuń pakiet
apt-get remove curl
Teraz przetestuj powyższe odpowiedzi.
Następujące polecenie wydaje się rozwiązać ten warunek:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'
Spowoduje to ostateczne zainstalowanie lub niezainstalowanie
źródło
config-files
- więc myślę, że ostateczny| grep -q "installed"
jest naprawdę potrzebny, aby uzyskać funkcjonalny kod wyjścia.| grep -q '^installed$'
Wydaje się, że obecnie
apt-get
ma opcję,--no-upgrade
która robi to, czego chce OP:Strona z https://linux.die.net/man/8/apt-get
Dlatego możesz użyć
i
package
zostanie zainstalowany tylko, jeśli nie jest.źródło
źródło
command -v <command>
; Niewhich <command>
. Zobacz także Sprawdź, czy program istnieje ze skryptu Bash .To wystarczy.
apt-get install
jest idempotentny.źródło
apt-get install
pakietu jest niepożądane, gdy pakiet jest już zainstalowany, nawet jeśli sama komenda jest idempotentna. W moim przypadku instaluję pakiet na zdalnym systemie z surowym modułem Ansible, który będzie zgłaszał zmiany systemu za każdym razem, gdy będę działałapt-get install
bez rozróżnienia. Warunkowe rozwiązuje ten problem.Posługiwać się:
Jeśli nie jest zainstalowany, pokaże:
W przeciwnym razie pokaże:
źródło
Ta funkcja już istnieje w Ubuntu i Debianie, w
command-not-found
pakiecie.źródło
command-not-found
jest interaktywnym pomocnikiem, a nie narzędziem zapewniającym odpowiednie zależności. Oczywiście właściwym sposobem deklarowania zależności jest spakowanie oprogramowania w pakiet Debiana i prawidłowe wypełnienieDepends:
deklaracji wdebian/control
pliku pakietu .wydaje się być najprostszym sposobem na zrobienie tego poza programem dpkg i starszymi narzędziami apt- *
źródło
źródło
command -v <command>
; Niewhich <command>
. Zobacz także Sprawdź, czy program istnieje ze skryptu Bash .Miałem podobne wymaganie, gdy uruchomiłem test lokalnie zamiast w oknie dokowanym. Zasadniczo chciałem zainstalować wszystkie znalezione pliki .deb, jeśli nie zostały jeszcze zainstalowane.
Wydaje mi się, że jedynym problemem, jaki widzę, jest to, że nie sprawdza numeru wersji pakietu, więc jeśli plik .deb jest nowszą wersją, nie zastąpiłoby to aktualnie zainstalowanego pakietu.
źródło
W przypadku Ubuntu apt zapewnia dość przyzwoity sposób na zrobienie tego. Poniżej znajduje się przykład dla Google Chrome:
apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable
Przekierowuję wyjście błędu na zero, ponieważ apt ostrzega przed użyciem jego „niestabilnego cli”. Podejrzewam, że pakiet list jest stabilny, więc myślę, że można odrzucić to ostrzeżenie. -Qq czyni apt super cichym.
źródło
To polecenie jest najbardziej niezapomniane:
Jeśli jest zainstalowany, drukuje:
W przeciwnym razie drukuje się
Zostało to przetestowane na Ubuntu 12.04.1 (Precise Pangolin).
źródło
dpkg --get-selections <package-name>
nie ustawia kodu wyjścia na wartość niezerową, gdy pakiet nie zostanie znaleziony.Wiele rzeczy zostało powiedzianych, ale dla mnie najprostszym sposobem jest:
źródło
W Bash:
Pamiętaj, że możesz mieć ciąg znaków z kilkoma pakietami w PKG.
źródło
Używam następującego sposobu:
źródło