答案1
除非只有一个提供程序,否则 Apt 不会安装虚拟包。如果另一个包依赖于虚拟包,它通常还会将真实包命名为替代包(即 build-essential 依赖于“libc6-dev | libc-dev” - 第二个是虚拟包)。
虚拟包未安装,因此您无法检查其状态。您可以使用apt-cache showpkg <pkg-name>
查看哪些包提供虚拟包,然后检查其中是否已安装。
答案2
您可以使用grep 状态(包dctrl-tools
,默认情况下未安装)查找所有已安装的包,提供一些虚拟包:
$ grep-status -FProvides,Package -sPackage,Provides,Status awk
Package: mawk
Provides: awk
Status: install ok installed
Package: gawk
Provides: awk
Status: install ok installed
答案3
@FlorianDiesch 的答案看起来很有趣,但我想要一些不需要任何默认未安装的软件的东西。
我最终使用了这个:
function check_packages_and_install_if_absent()
{
for PACKAGENAME
do
if
dpkg -l "$PACKAGENAME" | grep ^ii
then
echo "Package $PACKAGENAME is present"
continue
fi
FOUND=""
while read ACTUALPACKAGENAME
do
echo "$PACKAGENAME is a virtual package, that can be provided by $ACTUALPACKAGENAME"
if
dpkg -l "$ACTUALPACKAGENAME" | grep ^ii
then
echo "Actual package $ACTUALPACKAGENAME is present"
FOUND=true
break;
fi
done < <( apt-cache showpkg "${PACKAGENAME}" | sed -e '1,/^Reverse Provides: *$/ d' -e 's/ .*$//' | sort | uniq )
# Using sed to print lines after match
# https://stackoverflow.com/questions/32569032/sed-print-all-lines-after-match#answer-32569573
if [[ "$FOUND" == "true" ]]
then
continue
fi
echo "Package $PACKAGENAME is absent, installing"
sudo apt-get install -y "$PACKAGENAME"
done
}
您可以使用普通包名称和/或虚拟包名称列表来调用它:
function check_packages_and_install_if_absent foo bar baz
答案4
您可以查询已安装软件包的数据库包裹名字和
dpkg -l packagename
您可以列出所有文件包裹名字和
dpkg -L packagename
阅读man dpkg
更多信息,例如如何使用通配符。