Debian проверяет, установлен ли список пакетов, печатает отсутствующие имена пакетов - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть список пакетов: _DEPENDS="wget curl git..."

Мне нужно проверить, установлен ли каждый пакет, и распечатать имена пакетов, которые не установлены. Мое текущее решение работает только для 60% всех пакетов, потому что некоторые пакеты являются метапакетами и не отображаются при использовании команды which. (пример: libncurses5-dev не будет отображаться при использовании which)

for tools in $_DEPENDS
do
[[ $(which $tools 2>/dev/null) -eq 0 ]] || { echo -en "\n$tools need to be installed.\n" && exit 0; }
done

1 Ответ

0 голосов
/ 12 февраля 2020

Инструмент, который вы хотите использовать: dpkg.

for tool in $_DEPENDS; do
    dpkg -l "$tool" | grep -q '^i' && continue
    printf '%s\n' "$tool needs to be installed"
    # exit 1
done

Полагаю, вы не хотели, чтобы l oop закрывался при первом сбое; если вы действительно этого хотите, раскомментируйте exit. Я думаю, что здесь имеет смысл возвращать ошибку (выход с ненулевым кодом выхода), когда все зависимости не встречаются, и называть это успехом, когда все в порядке.

Возможно, по касательной также посмотрите синтаксис условных выражений - использование [[ здесь явно является антипаттерном.

Вот пример использования запасного варианта для отлова требований, которые не обязательно являются пакетами - проверьте, существует ли команда, если это не имя пакета.

for tool in $_DEPENDS; do
    if dpkg -l "$tool" | grep -q '^i'; then
        continue
    elif p=$(command -v "$tool"); then
        # dpkg -S "$p"
        continue
    else
        printf '%s\n' "$tool needs to be installed"
        # exit 1
    fi
done

Закомментированный dpkg -S напечатает, какой пакет предоставляет инструмент; Вы также можете использовать это, чтобы выяснить, был ли инструмент установлен с помощью dpkg или другими способами (например, если у вас есть /usr/local/bin/giti, вы верите, что это действительно нужная вам утилита, или вам требуется, чтобы она была dpkg -управляемый, т.е. /usr/bin/giti?)

Причина, по которой мы предпочитаем command -v вместо which, заключается в том, что последний не является переносимым; существует большое количество несовместимых which команд, и мы не можем знать, какая у вас есть, тогда как command - это встроенная оболочка, которая поддерживается POSIX.

Вероятно, лучшим решением будет просто перечислите названия пакетов, хотя. Если вы знаете, что covfefe предоставляет giti, перечислите covfefe в качестве вашей зависимости.

Лучше всего в целом создать простой пакет, который Depends: для них (возможно, с использованием equivs) и просто установите это; Apt позаботится обо всем остальном.

...