Инструмент, который вы хотите использовать: 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 позаботится обо всем остальном.