检查是否安装了软件包,如果没有安装,请安装

我正在开发一个Ubuntu系统,目前这就是我正在做的事情:

if ! which command > /dev/null; then echo -e "Command not found! Install? (y/n) \c" read if "$REPLY" = "y"; then sudo apt-get install command fi fi 

这是大多数人会做的吗? 还是有一个更优雅的解决scheme?

要检查是否安装了packagename ,请input:

 dpkg -s <packagename> 

你也可以使用dpkg-query来实现你的目的,并且接受通配符。

 dpkg-query -l <packagename> 

要find哪个包拥有该command ,请尝试:

 dpkg -S `which <command>` 

有关更多详细信息,请参阅文章查找软件包是否安装在Linux和dpkg备忘单中 。

为了更清楚一点,下面是一些bash脚本,用于检查包并根据需要安装它。 当然,你也可以在发现包丢失的情况下做其他的事情,比如简单地用一个错误代码退出。

 PKG_OK=$(dpkg-query -W --showformat='${Status}\n' the.package.name|grep "install ok installed") echo Checking for somelib: $PKG_OK if [ "" == "$PKG_OK" ]; then echo "No somelib. Setting up somelib." sudo apt-get --force-yes --yes install the.package.name fi 

如果脚本在GUI中运行(例如,它是一个Nautilus脚本),则可能需要用'gksudo'replace'sudo'调用。

这一个class轮返回1(安装)或0(未安装)的'纳米'包。

 $(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed") 

即使包不存在/不可用。

下面的例子安装了'nano'包,如果它没有安装。

 if [ $(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed") -eq 0 ]; then apt-get install nano; fi 

我提供了这个更新,因为Ubuntu添加了它的“个人包存档”(PPA),就像这个问题得到解答一样,PPA包有不同的结果。

1)未安装本地Debian存储库软件包:

 ~$ dpkg-query -l apache-perl ~$ echo $? 1 

2)在主机上注册并安装的PPA包:

 ~$ dpkg-query -l libreoffice ~$ echo $? 0 

3)在主机上注册但未安装的PPA包:

 ~$ dpkg-query -l domy-ce ~$ echo $? 0 ~$ sudo apt-get remove domy-ce [sudo] password for user: Reading package lists... Done Building dependency tree Reading state information... Done Package domy-ce is not installed, so not removed 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. 

另外张贴在: https : //superuser.com/questions/427318/test-if-a-package-is-installed-in-apt/427898

UpAndAdam写道:

但是,您不能简单地依靠这里的脚本返回代码

根据我的经验,您可以依靠dkpg的退出代码。

如果安装了软件包,则dpkg -s的返回代码为0,如果不是,则为1 ,所以我find的最简单的解决scheme是:

 dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name> 

适合我…

这似乎工作得很好。

 $ sudo dpkg-query -l | grep <some_package_name> | wc -l 
  • 如果未安装,则返回0如果安装,则返回一些> 0数字。

我发现上面的所有解决scheme可能会产生一个误报,如果一个软件包已安装,然后删除,但安装软件包保留在系统上。

复制:安装软件包apt-get install curl
删除包apt-get remove curl

现在testing以上的答案。

下面的命令似乎解决了这个问题:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'

这将导致一个明确的安装或未安装

这将做到这一点。 apt-get install是幂等的。

 sudo apt-get install command 

这个function已经存在于Ubuntu和Debian的command-not-found软件包中。

 $name="rsync" [ `which $name` ] $$ echo "$name : installed" || sudo apt-get install -y $name 

使用:

 apt-cache policy <package_name> 

如果没有安装,它会显示:

 Installed: none 

否则会显示:

 Installed: version 
 apt list [packagename] 

似乎是在dpkg和较老的apt- *工具之外完成的最简单的方法

 which <command> if [ $? == 1 ]; then <pkg-manager> -y install <command> fi 

这个命令是最令人难忘的:

 dpkg --get-selections <package-name> 

如果安装它打印:

<package-name>安装

否则,它打印

找不到匹配<package-name>的软件包。

这是在Ubuntu 12.04.1(精确穿山甲)testing。