在下面的问题中,有一种检查安装包之前是否已安装的解决方案:
我如何检查服务器上是否已安装某个软件包?
然而,我发现这对虚拟软件包无效。
有没有一种方法可以遍历 apt-get 自动选择的软件包名称并检查正确的软件包?
有没有一种方法可以遍历 apt-get 自动选择的软件包名称并检查正确的软件包?
apt-cache showpkg <pkg-name>
查看哪些软件包提供了虚拟包,然后检查这些软件包中是否有任何已安装的。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
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
dpkg -l packagename
dpkg -L packagename
man dpkg
以获取更多信息,例如如何使用通配符。
Reverse Provides
。 - darkdragonapt-cache show
的软件包名称(并进行安装)。 - apaderno