我正在研究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
这是大多数人会这样做的吗?还是有更优雅的解决方案?
要检查是否packagename
已安装,请键入:
dpkg -s
您也可以使用dpkg-query
具有整洁输出的用途,并接受外卡.
dpkg-query -l
要查找包拥有的包command
,请尝试:
dpkg -S `which`
有关更多详细信息,请参阅文章了解是否在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'替换'sudo'调用.
这个单线程为'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
我提供此更新,因为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 -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))
这看起来效果很好.
$ sudo dpkg-query -l | grep| wc -l
0
如果没有安装则返回,如果安装则返回一些数字> 0
.
UpAndAdam写道:
但是,您不能仅仅依靠返回代码来编写脚本
根据我的经验,你可以依靠dkpg的退出代码.
如果安装了软件包,则dpkg -s的返回码为0,如果不安装,则返回1,因此我找到的最简单的解决方案是:
dpkg -s2>/dev/null >/dev/null || sudo apt-get -y install
对我来说很好......