当前位置:  开发笔记 > 编程语言 > 正文

检查是否安装了apt-get软件包,然后安装它,如果它不在Linux上?

如何解决《检查是否安装了apt-get软件包,然后安装它,如果它不在Linux上?》经验,为你挑选了7个好方法。

我正在研究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

这是大多数人会这样做的吗?还是有更优雅的解决方案?



1> Török Gábor..:

要检查是否packagename已安装,请键入:

dpkg -s 

您也可以使用dpkg-query具有整洁输出的用途,并接受外卡.

dpkg-query -l 

要查找包拥有的包command,请尝试:

dpkg -S `which `

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


如果您作为一个人想要这种非编程方式,您可以使用此信息.但是,您不能简单地依赖于此处的返回代码来编写脚本或单独输出/缺少输出来编写脚本.您必须扫描这些命令的输出,限制它们对此问题的用处.
嘿,OP问'if`用法.我也在寻找`if`用法.
奇怪的是,我最近发现dpkg-query用于在丢失的包上返回1,现在(Ubuntu 12.04)返回0,在我的jenkins构建节点设置脚本上造成各种麻烦!dpkg -s在安装的软件包上返回0,在未安装的软件包上返回1.
注意:`dpkg -s`如果安装了包然后被删除则返回零 - 在这种情况下它是`Status:deinstall ok config-files`或类似的,所以它是"ok" - 所以对我来说,这不是一个安全测试.在这种情况下,`dpkg-query -l`似乎也没有返回有用的结果.

2> Urhixidur..:

为了更加明确一点,这里有一些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'替换'sudo'调用.


--force-yes似乎不是一个好主意。来自手册页:“这是一个危险的选项,它将导致apt-get继续运行而不会提示是否正在做潜在有害的事情。除非在非常特殊的情况下,否则不应使用它。使用--force-yes可能会破坏您的系统!” 在脚本中使用它会使情况变得更糟。

3> 小智..:

这个单线程为'nano'包返回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


更简单:`如果!dpkg-query -W -f ='$ {Status}'nano | grep"ok installed"; 然后安装nano; fi` - 不需要使用`grep -c`,只需使用`grep`的退出状态
我对此的变化:`dpkg-query -W -f ='$ {Status}'MYPACKAGE | grep -q -P'^ install ok installed $'; echo $?`

4> tahoar..:

我提供此更新,因为Ubuntu在回答此问题时添加了"个人包存档"(PPA),并且PPA包具有不同的结果.

    未安装Native Debian存储库包:

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

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

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

    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


如果安装和删除软件包,则接下来使用dpkg-query package; 回声$?如果未安装该软件包,也将为0。

5> Ciro Santill..:

dpkg -s 程序化用法

我很喜欢,dpkg -s因为1如果没有安装任何软件包,它会以状态退出,因此很容易实现自动化:

pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
  sudo apt-get install $pkgs
fi

man dpkg 不幸的是没有记录退出状态,但是我认为依靠它应该是相当安全的:

-s, --status package-name...
    Report status of specified package.

也可以看看:

https://askubuntu.com/questions/423355/how-do-i-check-if-a-package-is-installed-on-my-server

在Ubuntu 18.10上测试。

Python apt

apt在Ubuntu 18.04中有一个预安装的Python 3软件包,它公开了Python apt接口!

可以在以下位置查看脚本,该脚本检查是否安装了软件包,如果没有安装,则将其安装:如何使用python-apt API安装软件包

这是一份副本供参考:

#!/usr/bin/env python
# aptinstall.py

import apt
import sys

pkg_name = "libjs-yui-doc"

cache = apt.cache.Cache()
cache.update()
cache.open()

pkg = cache[pkg_name]
if pkg.is_installed:
    print "{pkg_name} already installed".format(pkg_name=pkg_name)
else:
    pkg.mark_install()

    try:
        cache.commit()
    except Exception, arg:
        print >> sys.stderr, "Sorry, package installation failed [{err}]".format(err=str(arg))



6> 小智..:

这看起来效果很好.

$ sudo dpkg-query -l | grep  | wc -l

0如果没有安装则返回,如果安装则返回一些数字> 0.


`grep | wc -l`是一个反模式.要检查是否存在某些内容,您只需要`grep -q`.要实际计算出现次数(在这种情况下很少有用),请使用`grep -c`.

7> 小智..:

UpAndAdam写道:

但是,您不能仅仅依靠返回代码来编写脚本

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

如果安装了软件包,则dpkg -s的返回码为0,如果不安装,则返回1,因此我找到的最简单的解决方案是:

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

对我来说很好......


在`apt-get remove `之后,`dpkg -s `仍然返回0,即使包是'deinstalled`
推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有