dpkg-query
так как в вашей связанной публикации, кажется, самый правильный инструмент для работы, за исключением использования, например, доступных библиотек Python для непосредственного связывания с системой APT в таком контексте сценариев.
С dpkg-query
:
dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Возвращает значение true (состояние выхода 0
в сценарии оболочки), если пакет установлен, в 1
противном случае - значение false (состояние выхода ).
-W
означает «Показать» ( dpkg-query
должно иметь запрошенное действие).
-f
меняет формат вывода.
db:Status-abbrev
это краткая форма статуса пакета.
2>/dev/null
заставляет замолчать, dpkg-query
если задано неверное имя пакета. Как это следует делать, может быть вопросом от случая к случаю.
grep -q
возвращает true, если есть совпадение, иначе false.
Если это используется часто, это может быть сделано простой функцией:
#!/bin/sh
debInst() {
dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}
if debInst "$1"; then
printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi
или просто
#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi
Даниэль Андерссон
источник
dpkg-query -l "$package" | grep -q ^.i
обычно достаточно (и легче запомнить).dpkg-query -l
вывод не установлен в камне, так как это просто режим пользовательской презентации, поэтому, если презентация изменится, возможно, такой скрипт сломается.dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'
с тем же эффектом.Я проверил предложения Дэниела на трех пакетах с этими результатами:
Собственный пакет репозитория Debian не установлен:
Пакет PPA зарегистрирован на хосте и установлен:
Пакет PPA зарегистрирован на хосте, но не установлен:
Хотя мне нравится подход, кажется, я не могу доверять коду возврата пакетов PPA. Если не считать этого, я думаю, что я буду придерживаться синтаксического анализа возврата
apt-cache policy
команды.источник
grep
роль в своем вставке. Я не могу воспроизвести вашу проблему, но это может быть из-за того, что примеры кода в настоящее время неполные, поэтому, пожалуйста, исправьте это. Вы запускаете Debian или Ubuntu?grep
сыгранную в команде, поэтому вы сняли ее, и теперь вы говорите, что она не работает?grep -q
дает код возврата,1
если он не совпадает, то есть программа не установлена или недоступна, или0
если программа установлена. Я объяснил это в моем посте.источник
DEPS=$(echo {dialog,sqlite3,openssh-client})
может быть эквивалентно написано как простоDEPS="dialog sqlite3 openssh-client"
.Мне нравится ответ Даниэля Андерссона, но он не сработал для меня. Я на Ubuntu 12.04.
Со страницы руководства dpkg ,
db:Status-abbrev
работает только в dpkg 1.16.2+:Мое решение состояло в том, чтобы использовать устаревшее поведение, только
Status
форматер:выходы
Я предполагаю, что это было вдохновением для «ii» в других представлениях.
Итак, чтобы полностью адаптировать ответ Дэниела Андерссона для работы с более старой версией dpkg и, следовательно, со старыми дистрибутивами Ubuntu:
Возвращает:
источник