如何从bash检查Debian中是否存在软件包


12

我想编写一个安装bash脚本,在其中安装MySQL服务器。

在Linux Mint上,我遵循以下代码:

apt-get -y --force-yes install mysql-server-5.6

但是我安装了新的Debian 8,但没有mysql-server-而是有mariadb

我如何找出包装是否存在?

我只知道dpkg -s应该告诉哪个软件包是否已安装。


3
--force-yes停用所有安全性,因此您确实可以将系统破坏到无法修复的程度。另外:--force-yes覆盖(停用)-y。后者可能是选择的选项:-yis 的长形式--assume-yes,这就是它的作用;要说“是”,直到它变得非常丑陋,冒着在核心要素,基本面等方面造成严重破坏的风险。--force优先级会破坏安全性(很难学到)
erch 2015年

附录:你可能会喜欢--simulate的选项apt-get,做--dry-run,以防万一
erch

1
只是为了澄清一下:您想确定一个软件包是否在中定义的任何存储库中/etc/apt/sources.list,对吗?
wullxz 2015年

注意在Debian 8中实际上有一个mysql-server软件包以及mariadb:packages.debian.org/jessie/mysql-server
Dan Getz

Answers:


13

(以下内容来自Ubuntu,但同样的技术显然也适用于Debian)

$ apt-cache show screen
Package: screen
Priority: optional
Section: misc
Installed-Size: 950
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Axel Beckert <abe@debian.org>
Architecture: amd64
Version: 4.1.0~20120320gitdb59704-9
Depends: libc6 (>= 2.15), libpam0g (>= 0.99.7.1), libtinfo5
Suggests: iselect (>= 1.4.0-1) | screenie | byobu
Filename: pool/main/s/screen/screen_4.1.0~20120320gitdb59704-9_amd64.deb
Size: 645730
...

如果程序包存在,将显示信息。如果没有,您将看到类似以下内容:

$ apt-cache show foobar
N: Unable to locate package foobar
E: No packages found

此外,apt-cache如果找不到匹配的软件包,则退出代码的非零值。

附加说明:如果您使用apt-cache show packagewhere包是一个虚拟包(不存在,但例如被其他包引用),则会得到:

N: Can't select versions from package 'package' as it is purely virtual
N: No packages found

exit code为零(我认为这有点误导。)


3
只是为了完成此答案:您还可以sources.list使用以下命令从中搜索已定义的存储库apt-cache search *searchstring*。该命令还将搜索软件包的描述,并可以帮助您查找不知道确切软件包名称的软件包。
wullxz 2015年

1
@wullxz,仅apt-cache search ...返回任何匹配项和应用程序。即使什么都没找到,仍会返回0,这在bash脚本中不切实际。
亚历克西斯威尔克

4

我会用dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed"

它将检查mysql-server软件包是否已安装,如果已安装,它将把该事实打印到屏幕上。更为复杂的解决方案是bash(未经测试):

function package_exists() {
    return dpkg -l "$1" &> /dev/null
}

因此,可以在脚本中执行以下操作:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi

5
我想他想知道该软件包是否存在,而不是是否已经在本地计算机上安装了……
wullxz 2015年

0

单线:

apt-cache pkgnames | grep -q "\<$your_package_name\>"

如果存在,则以0退出;否则,则以1退出。

奖励:高效检查多个软件包,列在“ packages_we_want”文件中,每行一个,排序方式为sort

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_want列出所需的所有软件包,但在存储库中存在。

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want 列出您想要并存在于存储库中的所有软件包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.