【问题标题】:Package manager command that returns 0 or 1 in Ubuntu/Debian if a package is installed or not如果软件包已安装或未安装,则在 Ubuntu/Debian 中返回 0 或 1 的软件包管理器命令
【发布时间】:2011-08-25 07:30:21
【问题描述】:

我正在用 Perl 编写包安装程序脚本。如果安装了 Ubuntu/Debian 软件包,我需要一个命令(可能是操作系统命令),它向调用者脚本返回一个简单的 0 或 1。

我试过了

      dpkg -s

它总是返回 0。

      dpkg -L 

几乎可以工作,但如果用户不这样做

      apt-get --purge remove 

包,一些文件被留下并且总是返回0

我不想 grep 文本 - 我需要一个简单的真或假。 有什么想法吗?

@安迪:

   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

【问题讨论】:

  • 但是grep 确实返回一个简单的真或假。
  • @ikegami 必须有一个返回 0 或 1 的简单包管理器命令。如果我 grep 的文本更改并且我的程序在世界上,我所有的程序都会失败 - 不是一个选项。
  • 已记录包状态。如果他们改变,那将违反他们的文件。
  • @ikegami grep 文本时的问题是文本可以更改。这里有一个空格,你的正则表达式停止工作。没有人不会更改文本输出的断言。
  • 搜索引擎素材:使用标准包装系统,它是rpm -qi packagename packagename。如果安装了所有命名包,则返回值为 0,否则为 1。

标签: perl ubuntu debian package


【解决方案1】:

也许不理想,但这可行:

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

或者只是

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

【讨论】:

  • @bitbucket 有时你不得不拒绝优雅而追求功能。
  • @CanSpice 这不是查询软件包是否安装的规范方法——必须有一种更简单的方法。
  • grep -q 可用于使 /dev/null 重定向变得不必要
  • @ysth,我认为grep -q 也隐藏了错误,但在重新阅读手册页时并非如此。固定。
  • 有什么理由不做一个 grep 吗?
【解决方案2】:

我认为这样做:

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

不适用于虚拟包。

【讨论】:

    【解决方案3】:

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

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

    1. 使用dpkg --get-selections。退出状态始终为零,但输出非常简单:<package><white space><status>。这是“请求状态”(install/hold/deinstall/purge),它可能与实际的包状态不同,但通常不会。

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

    3. 实现一个直接确定依赖关系是否存在的测试,例如,使用pkg-config,或者在PATH中搜索一个程序。这样做的好处是,它将允许在依赖项已手动构建并在包管理器不知情的情况下安装的系统上继续安装。这也使您的安装脚本更具可移植性。

    4. 您可能想查看PackageKit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2018-05-21
      • 2012-02-15
      • 2017-12-30
      • 2019-03-05
      • 1970-01-01
      • 2019-06-28
      相关资源
      最近更新 更多