如果安装或未安装软件包,在 Ubuntu/Debian 中返回 0 或 1 的软件包管理器命令
我正在用 Perl 编写一个包安装程序脚本。我需要一个命令(可能是操作系统命令),如果安装了 Ubuntu/Debian 软件包,它会向调用者脚本返回简单的 0 或 1。
我试过
dpkg -s
它总是返回 0。
dpkg -L
几乎可以工作,但如果用户不安装
apt-get --purge remove
软件包,则会留下一些文件并且总是返回 0
我不想 grep 文本 - 我需要一个简单的 true 或 false。 有什么想法吗?
@安迪:
aptitude remove unixodbc -y
dpkg-query -W unixodbc; echo $?
unixodbc 2.2.11-21
0
aptitude install unixodbc -y
dpkg-query -W unixodbc; echo $?
unixodbc 2.2.11-21
0
I'm writing a package installer script in Perl. I need a command (probably OS command) that returns a simple 0 or 1 to the caller script if a Ubuntu/Debian package is installed or not.
I've tried
dpkg -s
It always returns 0.
dpkg -L
almost works but if the user does not
apt-get --purge remove
the packages, some files are left and always returns 0
I don't want to grep text - a simple true or false is what I need.
Any ideas?
@Andy:
aptitude remove unixodbc -y
dpkg-query -W unixodbc; echo $?
unixodbc 2.2.11-21
0
aptitude install unixodbc -y
dpkg-query -W unixodbc; echo $?
unixodbc 2.2.11-21
0
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
也许不理想,但这有效:
或者只是
Maybe not ideal, but this works:
Or just
我认为这样做:
不适用于虚拟包。
I think this does it:
Won't work on virtual packages.
如果您打算使用 dpkg 数据库,我同意“使用 grep”建议。权衡软件包工具的输出格式发生变化的可能性与替代解决方案的复杂性,最好使用 grep。
也就是说,这里有一些可能性:
使用
dpkg --get-selections
。退出状态始终为零,但输出非常简单:
。这是“请求的状态”(安装/保留/卸载/清除),它可能与实际的包状态不同,但通常不会。使用
dctrl-tools
或dpkg-awk
软件包中的实用程序之一实现直接确定依赖关系是否存在的测试,例如,使用
pkg-config
,或在以下位置搜索程序路径
。这样做的优点是,它将允许在手动构建依赖项并在包管理器不知情的情况下安装的系统上继续安装。这也使您的安装脚本更加可移植。您可能需要查看 PackageKit
If you're going to use the dpkg database, I concur with the "use grep" suggestions. Weighing the possibility that the output format of the package tools changes against the complexity of the alternative solutions, it's probably better to use grep.
That said, here are some possibilities:
use
dpkg --get-selections
. The exit status is always zero, but the output is very simple:<package><white space><status>
. This is the "requested state" (install/hold/deinstall/purge), which can differ from the actual package state, but usually won't.use one of the utilities in the
dctrl-tools
ordpkg-awk
packagesimplement a test that directly determines whether the dependency is present, e.g., use
pkg-config
, or search for a program inPATH
. This has the advantage that it will allow the install to continue on systems where the dependency has been built by hand and installed without the knowledge of the package manager. This also makes your install script more portable.you may want to look in to PackageKit