Mam prosty wymóg. Chcę zdefiniować kilka zmiennych, które będą odpowiadały dowolnej liczbie podanych pakietów, które chcę zainstalować za pomocą skryptu powłoki.
Przykładowy kod poniżej:
MISC="shutter pidgin"
WEB="apache2 mongodb"
for pkg in $MISC $WEB; do
if [ "dpkg-query -W $pkg | awk {'print $1'} = """ ]; then
echo -e "$pkg is already installed"
else
apt-get -qq install $pkg
echo "Successfully installed $pkg"
fi
done
Wszystko trochę działa, ale logika wydaje się wadliwa, ponieważ nie niezawodne instalowanie pakietów, których chcę. Mówi albo, że zostały już zainstalowane, albo próbuje zainstalować pakiety, które zostały już zainstalowane wcześniej.
Próbowałem również z command -v
lub następujące:
if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then
A nawet z flagami -n
i, -z
aby sprawdzić, czy zwrócony ciąg był pusty. Jestem prawie pewien, że brakuje mi tutaj rozsądku.
Czy masz pojęcie, co mogę zrobić, aby upewnić się, że pakiet jest rzeczywiście zainstalowany, czy nie?
Dzięki!
apt-get install
o zainstalowane pakiety? Możesz po prostu zadzwonićapt-get install $MISC $WEB
.Odpowiedzi:
Zasadniczo wystarczy zastąpić
if
warunekNie jest możliwe użycie
dpkg-query
, ponieważ zwraca wartość true również dla pakietów usuniętych, ale nie wyczyszczonych.Sugeruję również, aby sprawdzić kod wyjścia
apt-get
przed wysłaniem pomyślnego komunikatu:źródło
&>
zrobić?/dev/null
w tym przypadku), ponieważ nie potrzebujemy danych wyjściowych, tylko kod wyjścia. Działa tylko wbash
(musi być pierwszy wiersz skryptu#!/bin/bash
), w przeciwnym razie użyj>/dev/null 2>&1
.Możesz to przetestować poprzez dpkg-query:
Pamiętaj, że * i? są symbolami wieloznacznymi, jeśli występują w $ pkg. Wydaje mi się, że dpkg-query może wypisać „zainstalowany ponownie wymagany” zamiast „ok zainstalowany”, jeśli pakiet jest uszkodzony i wymaga ponownej instalacji za pomocą polecenia,
apt-get install --reinstall
którego można również użyć do zainstalowania nowych pakietów.źródło
źródło