如果安装或未安装软件包,在 Ubuntu/Debian 中返回 0 或 1 的软件包管理器命令

发布于 2024-11-07 00:13:34 字数 608 浏览 0 评论 0原文

我正在用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

樱花细雨 2024-11-14 00:13:34

也许不理想,但这有效:

dpkg -s "$package" | grep '^Status:' | grep -q ' installed'

或者只是

dpkg -s "$package" | grep -q '^Status:.* installed'

Maybe not ideal, but this works:

dpkg -s "$package" | grep '^Status:' | grep -q ' installed'

Or just

dpkg -s "$package" | grep -q '^Status:.* installed'
折戟 2024-11-14 00:13:34

我认为这样做:

test -n "`aptitude search '?name(^packagename$)~i'`"

不适用于虚拟包。

I think this does it:

test -n "`aptitude search '?name(^packagename$)~i'`"

Won't work on virtual packages.

错々过的事 2024-11-14 00:13:34

如果您打算使用 dpkg 数据库,我同意“使用 grep”建议。权衡软件包工具的输出格式发生变化的可能性与替代解决方案的复杂性,最好使用 grep。

也就是说,这里有一些可能性:

  1. 使用dpkg --get-selections。退出状态始终为零,但输出非常简单:。这是“请求的状态”(安装/保留/卸载/清除),它可能与实际的包状态不同,但通常不会。

  2. 使用 dctrl-toolsdpkg-awk 软件包中的实用程序之一

  3. 实现直接确定依赖关系是否存在的测试,例如,使用 pkg-config,或在以下位置搜索程序路径。这样做的优点是,它将允许在手动构建依赖项并在包管理器不知情的情况下安装的系统上继续安装。这也使您的安装脚本更加可移植。

  4. 您可能需要查看 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:

  1. 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.

  2. use one of the utilities in the dctrl-tools or dpkg-awk packages

  3. implement a test that directly determines whether the dependency is present, e.g., use pkg-config, or search for a program in PATH. 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.

  4. you may want to look in to PackageKit

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文