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

时间:2011-05-13 23:08:55

标签: perl ubuntu debian package

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

我试过

      dpkg -s

它总是返回0.

      dpkg -L 

几乎可以工作,但如果用户没有

      apt-get --purge remove 

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

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

@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

3 个答案:

答案 0 :(得分:3)

也许不理想,但这有效:

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

或者只是

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

答案 1 :(得分:1)

我认为这样做:

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

不适用于虚拟包。

答案 2 :(得分:0)

如果您打算使用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