2011-05-13 60 views
2

我正在使用Perl编写软件包安装程序脚本。我需要一个命令(可能是OS命令),如果安装了Ubuntu/Debian软件包,它将返回一个简单的0或1给调用者脚本。软件包管理器命令,在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 
+0

但'grep'确实返回一个简单的真或假。 – ikegami 2011-05-13 23:21:36

+0

@ikegami必须有简单的包管理器命令返回0或1.如果我grep的文本发生变化,并且我的程序在世界中,我的所有程序都将失败 - 这不是一个选项。 – bitbucket 2011-05-13 23:27:39

+0

包状态记录。如果他们改变了,那将违反他们的文件。 – ikegami 2011-05-13 23:31:58

回答

3

也许并不理想,但这个工程:

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

或者只是

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

这不太优雅。 – bitbucket 2011-05-13 23:38:14

+2

@bitbucket有时你必须拒绝优雅而偏爱功能。 – CanSpice 2011-05-13 23:51:33

+0

@CanSpice这不是查询包是否安装的标准方法 - 必须有一个更简单的方法。 – bitbucket 2011-05-13 23:55:05

0

如果你要使用的dpkg数据库,我赞同“使用grep”的建议。考虑到封装工具的输出格式随着替代解决方案的复杂性而变化的可能性,最好使用grep。

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

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

  2. 使用在dctrl-toolsdpkg-awk

  3. 实施一个测试,直接决定的依赖是否存在,例如,使用pkg-config,或搜索PATH程序公用事业之一。这具有以下优点:它允许安装在依赖性由手工构建且在不知道包管理器的情况下安装的系统上继续。这也使得你的安装脚本更加便携。

  4. 你可能想在看向PackageKit

1

我觉得这个做的:

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

将无法​​在虚拟包工作。